在一列中查找与另一列中的某些值关联的值
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
+ filter
和 isin
+ 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
我有以下示例 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
+ filter
和 isin
+ 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