私は数日間問題に悩まされています。誰かが助けてくれたらありがたいです.
整数リスト項目で満たされた列を持つデータフレームがあります。
たとえば、単一列のデータフレーム:
>>> 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 で期待どおりに動作します (pip3 を介したいくつかの更新を含む xubuntu のデフォルト インストール)。たとえば、値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)が何であれ、関数が機能することを望みます。多分私はそれを間違った方法でやっています。どんな助けでも大歓迎です。
EDIT 1 : どちらの場合も pandas 0.22.0 を使用しています。
解決策:解決策を見つけました。この問題は、anaconda のクエリ関数のデフォルト engine='numexpr' が原因で発生します。engine='python' を設定すると、再び動作します。