我正在使用具有以下结构的DataFrame:
import pandas as pd
df = pd.DataFrame({'group' : [1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 5],
'id' : ['A_410', 'B_171', 'X_218', 'A_685', 'B_305', 'C_407', 'X_202', 'B_989', 'C_616', 'X_267', 'A_112', 'C_358'],
'active' : [-1, -1, 999, -1, -1, 1, 999, 1, 1, 999, -1, 1]})
print(df)
group id active
0 1 A_410 -1
1 1 B_171 -1
2 1 X_218 999
3 2 A_685 -1
4 2 B_305 -1
5 2 C_407 1
6 2 X_202 999
7 3 B_989 1
8 3 C_616 1
9 3 X_267 999
10 4 A_112 -1
11 5 C_358 1
我的目标很容易制定:我只想查看其中具有至少一个活动ID的组(活动ID标记为1)。
生成的DataFrame应该如下所示:
group id active
1 2 A_685 -1
2 2 B_305 -1
3 2 C_407 1
4 2 X_202 999
5 3 B_989 1
6 3 C_616 1
7 3 X_267 999
8 5 C_358 1
不幸的是,我不知道如何用Python / Pandas语法来表述。我使用适当的关键字搜索了以前的帖子,但找不到类似的问题。任何帮助,将不胜感激。
答案 0 :(得分:3)
比较值1
,并按GroupBy.transform
每组至少测试一个True
,最后按boolean indexing
进行过滤:
df = df[df['active'].eq(1).groupby(df['group']).transform('any')]
print (df)
group id active
3 2 A_685 -1
4 2 B_305 -1
5 2 C_407 1
6 2 X_202 999
7 3 B_989 1
8 3 C_616 1
9 3 X_267 999
11 5 C_358 1
另一种解决方案是使用1
检查所有组,并用Series.isin
过滤原始列group
:
df = df[df['group'].isin(df.loc[df['active'].eq(1), 'group'])]