我有以下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
+all
做groupby
+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