Преобразование переменной в строку в среде dask

Я пытаюсь преобразовать имя переменной в строку в среде dask. Этот код отлично работает в обычной среде Python. Однако этот код не работает, когда я запускаю его после создания dask datarame. Код ниже.

from dask.distributed import Client
client = Client()
import dask.dataframe as dd

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['ant','ant','cherry', 'dog', 'ant'], 'B':['animal','animal1', 'fruit', 'animal', 'animal'], 'C':['small','small1','small', 'big', np.nan]})

ddf = dd.from_pandas(df, npartitions=2)

ddf.head()

#The below code gives an error because of the above code (Please see the **error** below). The below code on its own runs fine.

my_var = [2,'wew','ewwew','44']
[ k for k,v in locals().items() if v == my_var][0]

РЕДАКТИРОВАТЬ

# The expected output. It works on jupyter notebook without any modules 
# loaded. (It is the name of the list)
out []: 'my_var' 

Ошибка ниже.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/env/lib/python3.5/site-packages/dask/dataframe/utils.py in raise_on_meta_error(funcname, udf)
    159     try:
--> 160         yield
    161     except Exception as e:

~/env/lib/python3.5/site-packages/dask/dataframe/core.py in elemwise(op, *args, **kwargs)
   3426         with raise_on_meta_error(funcname(op)):
-> 3427             meta = partial_by_order(*parts, function=op, other=other)
   3428 

~/env/lib/python3.5/site-packages/dask/utils.py in partial_by_order(*args, **kwargs)
    903         args2.insert(i, arg)
--> 904     return function(*args2, **kwargs)
    905 

~/env/lib/python3.5/site-packages/pandas/core/ops.py in f(self, other)
   2090 
-> 2091         other = _align_method_FRAME(self, other, axis=None)
   2092 

~/env/lib/python3.5/site-packages/pandas/core/ops.py in _align_method_FRAME(left, right, axis)
   1984         # GH17901
-> 1985         right = to_series(right)
   1986 

~/env/lib/python3.5/site-packages/pandas/core/ops.py in to_series(right)
   1946                 raise ValueError(msg.format(req_len=len(left.columns),
-> 1947                                             given_len=len(right)))
   1948             right = left._constructor_sliced(right, index=left.columns)

ValueError: Unable to coerce to Series, length must be 3: given 4

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-5-ce21a4e5e37e> in <module>
      1 my_var = [2,'wew','ewwew','44']
----> 2 [ k for k,v in locals().items() if v == my_var][0]

<ipython-input-5-ce21a4e5e37e> in <listcomp>(.0)
      1 my_var = [2,'wew','ewwew','44']
----> 2 [ k for k,v in locals().items() if v == my_var][0]

~/env/lib/python3.5/site-packages/dask/dataframe/core.py in <lambda>(self, other)
   1199             return lambda self, other: elemwise(op, other, self)
   1200         else:
-> 1201             return lambda self, other: elemwise(op, self, other)
   1202 
   1203     def rolling(self, window, min_periods=None, freq=None, center=False,

~/env/lib/python3.5/site-packages/dask/dataframe/core.py in elemwise(op, *args, **kwargs)
   3425                  else d._meta_nonempty for d in dasks]
   3426         with raise_on_meta_error(funcname(op)):
-> 3427             meta = partial_by_order(*parts, function=op, other=other)
   3428 
   3429     result = new_dd_object(graph, _name, meta, divisions)

/usr/lib/python3.5/contextlib.py in __exit__(self, type, value, traceback)
     75                 value = type()
     76             try:
---> 77                 self.gen.throw(type, value, traceback)
     78                 raise RuntimeError("generator didn't stop after throw()")
     79             except StopIteration as exc:

~/env/lib/python3.5/site-packages/dask/dataframe/utils.py in raise_on_meta_error(funcname, udf)
    175                 "{2}")
    176         msg = msg.format(" in `{0}`".format(funcname) if funcname else "", repr(e), tb)
--> 177         raise ValueError(msg)
    178 
    179 

ValueError: Metadata inference failed in `eq`.

Original error is below:
------------------------
ValueError('Unable to coerce to Series, length must be 3: given 4',)

Traceback:
---------
  File "/home/michael/env/lib/python3.5/site-packages/dask/dataframe/utils.py", line 160, in raise_on_meta_error
    yield
  File "/home/michael/env/lib/python3.5/site-packages/dask/dataframe/core.py", line 3427, in elemwise
    meta = partial_by_order(*parts, function=op, other=other)
  File "/home/michael/env/lib/python3.5/site-packages/dask/utils.py", line 904, in partial_by_order
    return function(*args2, **kwargs)
  File "/home/michael/env/lib/python3.5/site-packages/pandas/core/ops.py", line 2091, in f
    other = _align_method_FRAME(self, other, axis=None)
  File "/home/michael/env/lib/python3.5/site-packages/pandas/core/ops.py", line 1985, in _align_method_FRAME
    right = to_series(right)
  File "/home/michael/env/lib/python3.5/site-packages/pandas/core/ops.py", line 1947, in to_series
    given_len=len(right)))

Может ли кто-нибудь помочь мне в этом вопросе.

Спасибо

Майкл

Привет, Майкл, не могли бы вы поделиться Макви? Код, который вы разместили, не воспроизводится.

rpanai 10.04.2019 15:12

Это воспроизводимо. Просто скопируйте и вставьте код без ошибки. Спасибо

Schroter Michael 10.04.2019 15:16

Я получаю ошибку в этой строке [ k for k,v in locals().items() if v == my_var][0]. Будет здорово, если вы сможете показать, какой из них является ожидаемым результатом и как работает этот код при использовании pandas.

rpanai 10.04.2019 15:21

'my_var' - это ожидаемый результат. Он работает на ноутбуке Jupyter без загруженных модулей. Спасибо

Schroter Michael 10.04.2019 15:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
422
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код - очень странная вещь, чтобы попытаться сделать! Поскольку вы перебираете все переменные, вас не должно удивлять, если то, что происходит, зависит от того, какие переменные определены. Конкретный случай возникает из-за вопроса, есть ли 'wew' == df, и у фрейма данных есть очень конкретное понимание того, что означает равенство. Это может произойти и с фреймом данных pandas, или вообще со всем, что имеет сложную реализацию equals.

Вероятно, вы хотели протестировать только строки, поскольку знаете, что ищете:

[k for k, v in locals().items() if isinstance(v, str) and v == my_var][0]

Другие вопросы по теме