【问题标题】:How to query python3 dataframe with integer list elements如何使用整数列表元素查询python3数据框
【发布时间】:2018-03-13 01:32:00
【问题描述】:

我这几天一直被一个问题困扰,如果有人可以提供帮助,我将不胜感激。

我有一个数据框,其中有一列填充了整数列表项。

例如,单列数据框:

>>> 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 上运行它时,它会失败并显示以下消息:'Series' 对象是可变的,因此它们不能被散列

>>> 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: 在这两种情况下,我都使用 pandas 0.22.0。

解决方案: 我找到了解决方案。由于 anaconda 的查询函数的默认引擎 ='numexpr' 发生此问题。当设置engine='python'时,它又可以工作了。

【问题讨论】:

  • 我无法在 Python 3.6.4 中使用上述示例数据重现该错误。可能您使用的数据方案略有不同,或者数据有点脏。
  • 你的熊猫版本是什么?

标签: python python-3.x list dataframe numexpr


【解决方案1】:

似乎是由于 anaconda 的查询函数的默认引擎 ='numexpr' 而出现的问题。当设置engine='python'时,它又可以工作了。

我仍然无法弄清楚为什么它不能与 numexpr 引擎一起使用,但我可以接受。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多