DataFrame eval с использованием имени функции в выражении - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь использовать df.eval для вычисления выражения, содержащего вызов функции - в моем примере это numpy.around, которое я импортировал в локальное пространство имен. Согласно документации, использование @ перед именем функции должно помочь, но выдает эту ошибку

TypeError: объекты 'Series' являются изменяемыми, поэтому их нельзя хэшировать

Что я делаю не так? Не работает после нового запуска, в IDE (записная книжка Spyder / Jupyter) или с консоли.

import numpy as np
import pandas as pd
from numpy import around


df = pd.DataFrame({'x':np.array([1.12,2.76])})

# this throws TypeError: 'Series' objects are mutable, thus they cannot be hashed
df['y'] = df.eval('@around(x,1)')

# this works
df['z'] = around(df['x'],1)

print(pd.__version__)
# 0.23.4

print(np.__version__)
# 1.15.1

import sys
print(sys.version)
# 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)]

1 Ответ

0 голосов
/ 08 сентября 2018

Обновление Обойти это проще, не нужно удалять пакет numexpr, просто используйте другой механизм синтаксического анализа для выражения:

df['y'] = df.eval('@around(x,1)', engine = 'python')

Первый ответ

Мне удалось найти обходной путь, и я также выяснил, где проблема, кажется. Сначала я обновил conda сам и все пакеты (включая python до 3.7.0, но я не верю, что версия Python актуальна). После этого:

Шаг 1: удалить pandas и numpy

conda remove pandas numpy

The following packages will be REMOVED:

    bokeh:        0.13.0-py37_0
    mkl_fft:      1.0.4-py37h1e22a9b_1
    mkl_random:   1.0.1-py37h77b88f5_1
    numba:        0.39.0-py37h830ac7b_0
    numexpr:      2.6.8-py37h9ef55f4_0
    numpy:        1.15.1-py37ha559c80_0
    pandas:       0.23.4-py37h830ac7b_0
    scikit-learn: 0.19.1-py37hae9bb9f_0
    scipy:        1.1.0-py37h4f6bf74_1

Шаг 2: переустановить только pandas и numpy

    conda install pandas numpy

    The following NEW packages will be INSTALLED:

    mkl_fft:    1.0.4-py37h1e22a9b_1  
    mkl_random: 1.0.1-py37h77b88f5_1  
    numpy:      1.15.1-py37ha559c80_0  
    pandas:     0.23.4-py37h830ac7b_0  

После шага 2 код работал должным образом, поэтому проблема должна заключаться в удалении одного из других пакетов.

Шаг 3: добавьте каждый из пакетов, первоначально удаленных один за другим (bokeh, numba, Numberxpr, scikit-learn, scipy), и каждый раз проверяйте, работает ли код. После установки numexpr код не удался, так что именно в этом проблема. Не уверен, как вы могли бы добавить numpexpr обратно - я пробовал некоторые старые версии, но каждый раз код терпел неудачу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...