这是我的数据框,它有两列: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/