Python中使用pandas dataframe的列表问题

3

我有一个Pandas数据框,其中每一行都是一个列表。

我想搜索一个值,但出现了错误。我知道我的值存在。

我检查了这个:

df["text list"][1] == ['رهبری']

并获得:

True

然后我需要这个:
df[df["text list"] == ['رهبری']]

我遇到了这个错误:

    ValueError                                Traceback (most recent call last)
    <ipython-input-42-f14f1b2306ec> in <module>
    ----> 1 df[df["text list"] == ['رهبری']]

    ~/.local/lib/python3.6/site-packages/pandas/core/ops/__init__.py in wrapper(self, other, axis)
       1205             # as it will broadcast
       1206             if other.ndim != 0 and len(self) != len(other):
    -> 1207                 raise ValueError("Lengths must match to compare")
       1208 
       1209             res_values = na_op(self.values, np.asarray(other))

    ValueError: Lengths must match to compare

1
不确定,但可能是:df[df["text list"] == [['رهبری']]] - Erfan
不,我得到了相同的错误。 - mj125
请写下您的数据框... - umn
2
df[df['text list'].apply(lambda x: x == ['رهبری'])]?这只是猜测,因为您应该提供一个小的示例数据集,以便我们可以重现您的错误。 - Erfan
1
我使用这个最小的框架重现了错误:test_frame =pd.DataFrame(data = {'test list': [['entry1'], ['e1', 'e2']], 'column2': [1, 2]}) test_frame['test list'][0] == ['entry1'] >>> True test_frame[test_frame['test list'] == ['entry1']] >>> 错误 - Robert King
1
@Erfan,你的解决方案在我的最小示例中有效。 - Robert King
1个回答

2
当您直接将列表传递给DataFrame进行比较时,它期望一个大小相同的数组来进行逐个元素的比较。
为了避免这种情况,我们可以使用apply在每一行上检查列表是否存在:
# example dataframe
>>> df = pd.DataFrame({'text list':[['aaa'], ['bbb'], ['ccc']]})
>>> df
  text list
0     [aaa]
1     [bbb]
2     [ccc]

使用Series.apply函数来检查[bbb]:
>>> m = df['text list'].apply(lambda x: x == ['bbb'])
>>> df[m]
  text list
1     [bbb]

由于我们使用的是apply,它在后台基本上是一个“循环”实现。我们可以避免使用pandas的开销,并使用列表推导式:

>>> m = [x == ['bbb'] for x in df['text list']]
>>> df[m]
  text list
1     [bbb]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接