在一列中查找与另一列中的某些值关联的值

Find values in one column that have association with certain values in another column

我有以下示例 pandas 数据框:

df = pd.DataFrame({'A': ['a1', 'a2', 'a3', 'a1', 'a2', 'a4'],
                   'B': ['b1', 'b1', 'b2', 'b3', 'b6', 'b6']})

我想在 A 中找到与 B 中输入列表的所有值相关联的值。

例如,对于输入 lst = ['b1', 'b6'],所需的输出是 ['a2']。我试过 df[df['B'].isin(lst)]here 但它确实还不够,或者甚至可能没有必要。

我们可以用 groupby + filterisin + all

df.groupby('A').filter(lambda x : pd.Series(lst).isin(x['B']).all())
    A   B
1  a2  b1
4  a2  b6

s=pd.crosstab(df.A,df.B).ge(1)[lst].all(1) # you have the series 
s # s[s].index
A
a1    False
a2     True
a3    False
a4    False
dtype: bool

首先使用列表推导

过滤lst的每个元素df
a_list = [ df.loc[df['B']==el,'A'].tolist() for el in lst]
# [['a1', 'a2'], ['a2', 'a4']]

您要查找的值是 a_list

中所有列表的交集
list(set.intersection(*[set(x) for x in a_list]))
# ['a2']

使用 set.issubset 检查一个列表是否在另一个列表中:

m = df.groupby('A')['B'].apply(lambda x: set(lst).issubset(set(x)))
df[df['A'].map(m)]

    A   B
0  a1  b1
1  a2  b1
3  a1  b3
4  a2  b6
7  a2  b7
8  a1  b6