python - Pandas Dataframe - 如何检查 A 列中的字符串值是否在 B 列中的字符串项列表中可用

标签 python pandas dataframe

这是我的数据框,它有两列:A 列包含字符串,B 列包含字符串列表。

import pandas as pd

df = pd.DataFrame(columns=['A','B'])
df.loc[0] = ['apple',['orange','banana','blueberry']]
df.loc[1] = ['orange',['orange','banana','avocado']]
df.loc[2] = ['blueberry',['apple','banana','blueberry']]
df.loc[3] = ['cherry',['apple','orange','banana']]

print(df)

           A                            B
0      apple  [orange, banana, blueberry]
1     orange    [orange, banana, avocado]
2  blueberry   [apple, banana, blueberry]
3     cherry      [apple, orange, banana]

我想检查每一行,看看 A 列中的值是否列在同一行 B 列的列表中。因此,预期的输出应该是:

0 False
1 True
2 True
3 False

我尝试了 isin 来检查静态列表:

df.A.isin(['orange','banana','blueberry'])
0    False
1     True
2    False
3    False

但是,当我尝试使用它来检查数据框中的列表项时,它不起作用:

df.A.isin(df.B)
TypeError: unhashable type: 'list'

如果有使用 Pandas 的可用解决方案,我想避免使用 for 循环和 lambda。

非常感谢任何帮助。

最佳答案

集合的乐趣

df.A.apply(lambda x: set([x])) <= df.B.apply(set)

0    False
1     True
2     True
3    False
dtype: bool

没有循环

但我仍然会使用@jezrael 的理解

pd.DataFrame(df.B.tolist(), df.index).eq(df.A, 0).any(1)

0    False
1     True
2     True
3    False
dtype: bool

Numpy 广播

仅当 B 中的每个列表长度相同时才有效。

from numpy.core.defchararray import equal

pd.Series(
    equal(df.A.values.astype(str), np.array(df.B.tolist()).T).any(0),
    df.index
)

0    False
1     True
2     True
3    False
dtype: bool

pd.get_dummies

df.B.str.join('|').str.get_dummies().mul(pd.get_dummies(df.A)).any(1)

0    False
1     True
2     True
3    False
dtype: bool

np.bincount

我喜欢这个(-:
然而,jezrael 指出性能不佳)-:所以要小心。

i = np.arange(len(df)).repeat(df.B.str.len())
pd.Series(
    np.bincount(i, df.A.values[i] == np.concatenate(df.B)).astype(bool),
    df.index
)

0    False
1     True
2     True
3    False
dtype: bool

关于python - Pandas Dataframe - 如何检查 A 列中的字符串值是否在 B 列中的字符串项列表中可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49443513/

相关文章:

python - url_for 构建错误

python - 组合任意形状的张量

python - 检查 Pair Series 值以查看它们是否在列表中

python - 根据分类列的值数量对 Pandas 数据框进行排序

python - 如何将两个 Pandas Dataframe 列堆叠在一起?

python - 在其他函数中包装 functools.partial 的参数

python - 这个 os.path 用法有什么问题?

python - 总结具有重复列 Pandas 的多行

pandas - 如何有条件地重置 Pandas 数据框中的滚动最大初始值/行?

python - 值错误: arrays must all be same length in python