我正在尝试使用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)]
答案 0 :(得分:1)
更新
解决方法更简单,无需删除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步:添加最初删除的每个软件包(散景,numba,numexpr,scikit-learn,scipy),并每次测试代码是否仍然有效。安装numexpr
后,代码失败,因此问题出在这里。不确定如何重新添加numpexpr
-我尝试了一些旧版本,但是每次代码失败