我已经遇到一个问题几天了,如果有人能提供帮助,我将不胜感激。
我有一个数据帧,其中有一列填充了整数列表项目。
例如,单列数据帧:
>>> df=pd.DataFrame({'a':[[1, 2, 3], [2, 4, 5], [1, 7, 8]]})
>>> df
a
0 [1, 2, 3]
1 [2, 4, 5]
2 [1, 7, 8]
我想在数据帧上运行查询以选择其元素包含特定值的行。"in"运算符不适用于此操作。 我定义了一个在查询中调用的函数func
>>> def func(l, v):
... return l.apply(lambda val: v in val)
然后当我调用查询时,它在 python 3.6.3 上按预期工作(xubuntu 默认安装,通过 pip3 进行一些更新)。例如,它返回包含值 7 的唯一行
>>> df.query('@func(a, 7)')
a
2 [1, 7, 8]
但是,当我在最后一个 anaconda 版本中包含的 python 3.6.4 上运行它时,它失败并显示以下消息:">系列"对象是可变的,因此无法对其进行哈希处理。
>>> df.query('@func(a, 7)') Traceback (most recent call last): File "<stdin>", line 1, in <module> File
"/home/cedric/.local/lib/python3.6/site-packages/pandas/core/frame.py",
line 2297, in query
res = self.eval(expr, **kwargs) File "/home/cedric/.local/lib/python3.6/site-packages/pandas/core/frame.py",
line 2366, in eval
return _eval(expr, inplace=inplace, **kwargs) File "/home/cedric/.local/lib/python3.6/site-packages/pandas/core/computation/eval.py",
line 295, in eval
ret = eng_inst.evaluate() File "/home/cedric/.local/lib/python3.6/site-packages/pandas/core/computation/engines.py",
line 76, in evaluate
res = self._evaluate() File "/home/cedric/.local/lib/python3.6/site-packages/pandas/core/computation/engines.py",
line 122, in _evaluate
_check_ne_builtin_clash(self.expr) File "/home/cedric/.local/lib/python3.6/site-packages/pandas/core/computation/engines.py",
line 31, in _check_ne_builtin_clash
names = expr.names File "/home/cedric/.local/lib/python3.6/site-packages/pandas/core/computation/expr.py",
line 755, in names
return frozenset([self.terms.name]) File "/home/cedric/.local/lib/python3.6/site-packages/pandas/core/generic.py",
line 1045, in __hash__
' hashed'.format(self.__class__.__name__)) TypeError: 'Series' objects are mutable, thus they cannot be hashed
我希望我的函数能够使用我使用的任何 python3 (>= 3.6)。也许我做错了。任何帮助将不胜感激。
编辑 1: 我在这两种情况下都使用熊猫 0.22.0。
解决方案: 我找到了一个解决方案。出现此问题的原因是默认引擎='numexpr' 查询函数与 anaconda。当设置引擎='python'时,它会再次工作。
似乎由于使用 anaconda 查询函数的默认引擎='numexpr' 而出现问题。当设置引擎='python'时,它会再次工作。
我仍然无法弄清楚为什么它不适用于 numexpr 引擎,但我可以接受这一点。