在表达式中使用函数名称的DataFrame评估

时间:2018-09-08 08:54:16

标签: python pandas

我正在尝试使用df.eval来评估包含对函数调用的表达式-在我的示例中,它是numpy.around,我已经在本地名称空间中导入了该表达式。根据文档,在函数名称之前使用@应该可以解决问题,但是会引发此错误

  

TypeError:“系列”对象是可变的,因此不能进行散列处理

我在做什么错?重新运行后,在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 :(得分:1)

更新 解决方法更简单,无需删除numexpr包,只需对表达式使用其他解析引擎即可:

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

第一个答案

我设法找到了解决方法,并且我也弄清楚了问题出在哪里。首先,我将conda本身和所有软件包(包括python更新为3.7.0,但我认为Python版本无关)。之后:

步骤1:删除pandasnumpy

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步:仅重新安装pandasnumpy

    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步:添加最初删除的每个软件包(散景,numba,numexpr,scikit-learn,scipy),并每次测试代码是否仍然有效。安装numexpr后,代码失败,因此问题出在这里。不确定如何重新添加numpexpr-我尝试了一些旧版本,但是每次代码失败