根据条件删除行组

时间:2016-12-23 16:54:50

标签: python pandas

我有以下pandas数据帧:

df =

A          B       C
111-ABC    123    EEE
111-ABC    222    EEE
111-ABC    444    XXX
222-CCC    222    YYY
222-CCC    333    67T
333-DDD    123    TTT
333-DDD    123    BTB
333-DDD    444    XXX
333-DDD    555    AAA

我想删除A列中不包含123的所有行组(按B分组)。

预期结果是这一个(行222-CCC组被删除):

result =

A          B       C
111-ABC    123    EEE
111-ABC    222    EEE
111-ABC    444    XXX
333-DDD    123    TTT
333-DDD    123    BTB
333-DDD    444    AAA

怎么做?我假设首先我应该使用groupby,但是如何过滤掉行组,而不仅仅是特定的行?

result = df.groupby("A").... ??

2 个答案:

答案 0 :(得分:4)

您可以使用groupby().filter()语法:

df.groupby('A').filter(lambda g: (g.B == 123).any())

enter image description here

答案 1 :(得分:3)

使用query

a = df.query('B == 123').A.unique()
df.query('A in @a')

         A    B    C
0  111-ABC  123  EEE
1  111-ABC  222  EEE
2  111-ABC  444  XXX
5  333-DDD  123  TTT
6  333-DDD  123  BTB
7  333-DDD  444  XXX
8  333-DDD  555  AAA

您可以在第一个query

中添加其他条件
b = df.query('B == 123 & C == "EEE"').A.unique()
df.query('A in @b')

          A    B    C
0  111-ABC  123  EEE
1  111-ABC  222  EEE
2  111-ABC  444  XXX

如果速度很重要。试试这个。

cond1 = df.B.values == 123
a = np.unique(df.A.values[cond1])
df.loc[df.A.isin(a)]