gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:34:01 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com