首页 > 解决方案 > python问题与列表的熊猫数据框

问题描述

我有一个 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

标签: pythonpandas

解决方案


当您将列表直接传递给 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]

推荐阅读