在数据框的列中查找与另一列中的两个值相对应的值

时间:2019-10-30 17:34:35

标签: pandas

请考虑以下内容。

std::shared_ptr<Base>

我想在A列中找到与B列中的“ a”和“ c”相对应的值({2,4})。所以我写了以下查询。

d=pd.DataFrame([[1,'a'],[1,'b'],[2,'c'],[2,'a'],[3,'c'],[4,'a'],[4,'c']],columns=['A','B'])

我的逻辑是,自

d[d.A.isin(set(d[d.B=='c'].A)) & d.B=='a'].A

返回A中所有与'c'相关联的值,它应该返回{2,3,4}并返回。然后,我考虑所有以{2,3,4}开头的行,并从B中选择与它们相关联的'a'的行,以便获得A中所有具有'c'和'a的值与他们相关联。但是我的查询返回一个空集。它应该返回{2,4}。有人可以帮忙调试吗?谢谢。

2 个答案:

答案 0 :(得分:2)

我们可以使用filter

d.groupby('A').filter(lambda x : pd.Series(['a','c']).isin(x['B']).all()).A.unique()
Out[213]: array([2, 4], dtype=int64)

答案 1 :(得分:1)

使用DataFrame.groupby 检查A中的唯一值是否与B中的值'a'和值'c'相关联:

new_df=d[d.groupby('A')['B'].transform(lambda x: x.eq('a').any()&x.eq('c').any())]
print(new_df)

   A  B
2  2  c
3  2  a
5  4  a
6  4  c

unique_values=new_df['A'].unique()
print(unique_values)
#[2 4]

详细信息:

您想查找AB'a'中哪些值在'c'中具有关联。然后您可以根据行A中的唯一值使用groupby('A')对数据框执行操作:

d.groupby('A')

它允许根据A中的值进行分组操作

   A  B
0  1  a
1  1  b

2  2  c
3  2  a

4  3  c

5  4  a
6  4  c

现在,对于每个使用groupby.transform的组,我们都检查'{'}列中是否还有'c'和'a':

B
  • Series.any用于检查B系列中是否任何值 每个组为“ c”,或者如果系列B中的任何值为“ a”

  • Series.eq类似于使用d.groupby('A')['B'].transform(lambda x: x.eq('a').any()&x.eq('c').any()) 0 False 1 False 2 True 3 True 4 False 5 True 6 True Name: B, dtype: bool


此系列用于执行Boolean indexing

'=='

最后使用Series.unique 我们访问数据帧new_df的A的唯一值:

new_df=d[d.groupby('A')['B'].transform(lambda x: x.eq('a').any()&x.eq('c').any())]
print(new_df)

   A  B
2  2  c
3  2  a
5  4  a
6  4  c