Как удалить строки из DF в результате группового запроса? - PullRequest
1 голос
/ 13 июля 2020

У меня есть этот Pandas фрейм данных:

df = pd.DataFrame({'site': ['a', 'a', 'a', 'b', 'b', 'b', 'a', 'a', 'a'], 'day': [1, 1, 1, 1, 1, 1, 2, 2, 2],
                   'hour': [1, 2, 3, 1, 2, 3, 1, 2, 3], 'clicks': [100, 200, 50, 0, 0, 0, 10, 0, 20]})

#   site  day  hour  clicks
# 0    a    1     1     100
# 1    a    1     2     200
# 2    a    1     3      50
# 3    b    1     1       0
# 4    b    1     2       0
# 5    b    1     3       0
# 6    a    2     1      10
# 7    a    2     2       0
# 8    a    2     3      20

И я хочу удалить все строки для сайта / дня, где было 0 кликов. Итак, в приведенном выше примере я бы хотел удалить строки с site = 'b' и day = 1.

Я могу сгруппировать их и показать, где сумма равна 0 для дня / сайта:

print(df.groupby(['site', 'day'])['clicks'].sum() == 0)

Но как теперь можно легко удалить строки из исходного фрейма данных, где применяется это условие? Решение, которое у меня есть до сих пор, заключается в том, что я перебираю группу и сохраняю все кортежи сайта / дня в списке, а затем отдельно удаляю все строки, которые имеют эти комбинации сайт / день. Это работает, но я уверен, что должен быть более функциональный и элегантный способ добиться такого результата?

1 Ответ

4 голосов
/ 13 июля 2020

Вариант 1

Использование groupby, transform и логической индексации:

df[df.groupby(['site', 'day'])['clicks'].transform('sum') != 0]

Вывод:

  site  day  hour  clicks
0    a    1     1     100
1    a    1     2     200
2    a    1     3      50
6    a    2     1      10
7    a    2     2       0
8    a    2     3      20

Вариант 2

Использование groupby и filter:

df.groupby(['site', 'day']).filter(lambda x: x['clicks'].sum() != 0)

Вывод:

  site  day  hour  clicks
0    a    1     1     100
1    a    1     2     200
2    a    1     3      50
6    a    2     1      10
7    a    2     2       0
8    a    2     3      20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...