Как удалить ненужные строки в Pandas по условиям

Дан df:

a = pd.DataFrame([{'id': 1, 'b': 1, 'd': 0},
                  {'id': 1, 'b': 2, 'd': 0},
                  {'id': 1, 'b': 2, 'd': 1},
                  {'id': 1, 'b': 2, 'd': 0},
                  {'id': 1, 'b': 2, 'd': 0},
                  {'id': 1, 'b': 2, 'd': 0},
                  {'id': 1, 'b': 4, 'd': 0},

                  {'id': 2, 'b': 1, 'd': 1},
                  {'id': 2, 'b': 2, 'd': 0},
                  {'id': 2, 'b': 2, 'd': 0},
                  {'id': 2, 'b': 2, 'd': 0},
                  {'id': 2, 'b': 2, 'd': 0},
                  {'id': 2, 'b': 2, 'd': 1},
                  {'id': 2, 'b': 4, 'd': 0},])

Как можно у каждогоid и в строке, где b == 1, проверить столбец d если он != 0, то удалить все строки с этим id, то есть на выходе должно получиться:

        pd.DataFrame([{'id': 1, 'b': 1, 'd': 0},
                      {'id': 1, 'b': 2, 'd': 0},
                      {'id': 1, 'b': 2, 'd': 1},
                      {'id': 1, 'b': 2, 'd': 0},
                      {'id': 1, 'b': 2, 'd': 0},
                      {'id': 1, 'b': 2, 'd': 0},
                      {'id': 1, 'b': 4, 'd': 0}])

P.S. в каждом id только одна строка, где b == 1.


Ответы (1 шт):

Автор решения: strawdog

Можно попробовать так:

import pandas as pd

df = pd.DataFrame([{'id': 1, 'b': 1, 'd': 0},
                  {'id': 1, 'b': 2, 'd': 0},
                  {'id': 1, 'b': 2, 'd': 1},
                  {'id': 1, 'b': 2, 'd': 0},
                  {'id': 1, 'b': 2, 'd': 0},
                  {'id': 1, 'b': 2, 'd': 0},
                  {'id': 1, 'b': 4, 'd': 0},
                  {'id': 2, 'b': 1, 'd': 1},
                  {'id': 2, 'b': 2, 'd': 0},
                  {'id': 2, 'b': 2, 'd': 0},
                  {'id': 2, 'b': 2, 'd': 0},
                  {'id': 2, 'b': 2, 'd': 0},
                  {'id': 2, 'b': 2, 'd': 1},
                  {'id': 2, 'b': 4, 'd': 0},])

res = df.groupby('id').filter(lambda x: (x[x['b']==1]["d"].ne(1)))

res:

   id  b  d
0   1  1  0
1   1  2  0
2   1  2  1
3   1  2  0
4   1  2  0
5   1  2  0
6   1  4  0
→ Ссылка