在具有至少一个匹配条件的组上过滤DataFrame

时间:2019-12-08 16:33:15

标签: python pandas dataframe

我正在使用具有以下结构的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语法来表述。我使用适当的关键字搜索了以前的帖子,但找不到类似的问题。任何帮助,将不胜感激。

1 个答案:

答案 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'])]