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



我有以下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)],但它确实还不够,甚至可能没有必要。

使用列表理解在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']

我们可以用isin+allgroupby+filter

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

使用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

最新更新