pandasでqueryメソッドでエラーが出る。unhashable type: ‘numpy.ndarray’

結論:queryメソッドの引数に【engine=’python’】をつける

手元のPCで開発しているときには発生しないエラーがサーバで実行しているときに発生した。
Traceback (most recent call last):
  File ".¥(ファイル名).py", line 66, in <module>
    (集計値の変数) = (集計用の関数)(df)
  File ".¥(ファイル名).py", line 201, in (集計用の関数)
    (変数) = int(filter_df.query('(集計条件)')["カラム名"].nunique())
  File "C:¥ProgramData¥Anaconda3¥lib¥site-packages¥pandas¥core¥frame.py", line 3184, in query
    res = self.eval(expr, **kwargs)
  File "C:¥ProgramData¥Anaconda3¥lib¥site-packages¥pandas¥core¥frame.py", line 3300, in eval
    return _eval(expr, inplace=inplace, **kwargs)
  File "C:¥ProgramData¥Anaconda3¥lib¥site-packages¥pandas¥core¥computation¥eval.py", line 327, in eval
    ret = eng_inst.evaluate()
  File "C:¥ProgramData¥Anaconda3¥lib¥site-packages¥pandas¥core¥computation¥engines.py", line 70, in evaluate
    res = self._evaluate()
  File "C:¥ProgramData¥Anaconda3¥lib¥site-packages¥pandas¥core¥computation¥engines.py", line 118, in _evaluate
    _check_ne_builtin_clash(self.expr)
  File "C:¥ProgramData¥Anaconda3¥lib¥site-packages¥pandas¥core¥computation¥engines.py", line 27, in _check_ne_builtin_cl
ash
    names = expr.names
  File "C:¥ProgramData¥Anaconda3¥lib¥site-packages¥pandas¥core¥computation¥expr.py", line 851, in names
    return frozenset(term.name for term in com.flatten(self.terms))
TypeError: unhashable type: 'numpy.ndarray'
手元のPC:Windows10、Python.orgからインストールし、ライブラリは都度pip install している サーバ環境:Windows Server 2016、Pythonで作ったアプリを複数デプロイするため、Anacondaを使って仮想環境を作った ◎試したこと バージョンの問題かと思い、numpyのバージョンを揃えた
pip install numpy==1.18.1
結果は変わらず。
pip list
で双方のライブラリを比較すると、サーバのほう(Anaconda)のほうが多い。numpyに関係しそうな、ライブラリをGoogleで検索すると下記イシューを発見
https://github.com/pandas-dev/pandas/issues/29027
numexprとはnumpyの高速化するためのライブラリのとのこと。
https://github.com/pydata/numexpr
pandasのリファレンスを確認すると、numexprとPythonの”semantics”(?)が異なるため、queryメソッドが動かない。なので、明示的にPythonを指定すると、Pythonの書き方ができる。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です