我有一个如下所示的pandas
Dataframe :
import pandas as pd
foo = pd.DataFrame({'id_p': [1,1,2,2,3,3,3,4,4],
'id_d_b': [True, True, False, True, True, True,False,False,False],
'id_d_i': [False, False, True, False,False,False,True,True,True]})
foo
id_p id_d_b id_d_i
0 1 True False
1 1 True False
2 2 False True
3 2 True False
4 3 True False
5 3 True False
6 3 False True
7 4 False True
8 4 False True
我想选择在id_d_b``and
中至少有一个True
在id_d_i
中有一个True
的id_p
我试过这个
foo['id_d_b'] = foo['id_d_b'].astype(int)
foo['id_d_i'] = foo['id_d_i'].astype(int)
foo['has_id_d_b'] = foo.groupby('id_p')['id_d_b'].transform('max')
foo['has_id_d_i'] = foo.groupby('id_p')['id_d_i'].transform('max')
foo['result'] = foo['has_id_d_b'] + foo['has_id_d_i'] # if this is >1 then that specific id_p has at least one id_d_b and id_d_i
foo['result'] = foo.eval('result > 1')
foo
id_p id_d_b id_d_i has_id_d_b has_id_d_i result
0 1 1 0 1 0 False
1 1 1 0 1 0 False
2 2 0 1 1 1 True
3 2 1 0 1 1 True
4 3 1 0 1 1 True
5 3 1 0 1 1 True
6 3 0 1 1 1 True
7 4 0 1 0 1 False
8 4 0 1 0 1 False
这给出了正确的结果,但我正在寻找一个“一行”解决方案
2条答案
按热度按时间py49o6xq1#
您可以使用:
groupby.any
检查每个组中是否有任何值为True(最终针对列的子集),然后确保所有列都是带有all
的True
。使用isin
,您可以获得相关的索引(如果需要,可用于切片或索引)。对于指数:
或者,使用更昂贵的
groupby.transform
:输出:
ia2d9nvy2#
使用由聚合
GroupBy.any
和DataFrame.all
创建的Series.map
和Series
: