请考虑以下内容。
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}。有人可以帮忙调试吗?谢谢。
答案 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]
详细信息:
您想查找A
和B
中'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