我有以下 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").... ??

最佳答案

使用 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)]

关于python - 根据条件删除行组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41305160/

10-16 12:59