Используя pandas, как я могу сгруппировать / агрегировать случаи суммирования, где булевы столбцы истинны? - PullRequest
1 голос
/ 21 февраля 2020

У меня есть DataFrame, построенный из запроса к базе данных. Каждая строка во фрейме имеет идентификатор базы данных, дату, задание, логическое значение проблем и фиксированное логическое значение. Например:

data = [
    {'id': 1, 'date': '2020-02-01', 'job': 'ABC', 'issue': True, 'fixed': False},
    {'id': 2, 'date': '2020-02-01', 'job': 'ABC', 'issue': False, 'fixed': False},
    {'id': 3, 'date': '2020-02-01', 'job': 'ABC', 'issue': True, 'fixed': True},
    {'id': 4, 'date': '2020-02-01', 'job': 'DEF', 'issue': True, 'fixed': True}
]
data_df = pd.DataFrame(data)

Я хочу сделать groupby и agg, где я группируюсь по работе и дате, и получаю количество «проблем» и «исправленных», которые являются Истиной. Что-то вроде:

result_data = [
    {'date': '2020-02-01', 'job': 'ABC', 'issue': 2, 'fixed': 1},
    {'date': '2020-02-01', 'job': 'DEF', 'issue': 1, 'fixed': 1}
]
result_df = pd.DataFrame(result_data)

Код будет выглядеть примерно так:

result_df = data_df.groupby(['date', 'job']).agg({'issue': 'sum-true', 'fixed': 'sum-true'})

, но я не уверен, каким должен быть 'sum-true'. Нет, я не могу просто отфильтровать весь DF по столбцу, являющемуся истинным, и суммировать, так как issue может быть True, тогда как fixed равно False.

1 Ответ

1 голос
/ 21 февраля 2020

Как насчет этого?

>>> df.groupby(['date', 'job'])[['issue', 'fixed']].sum()
                issue  fixed
date       job              
2020-02-01 ABC    2.0    1.0
           DEF    1.0    1.0

Простое суммирование логического вектора вернет True count.

И если вам нужны данные в точном формате, который вы указали выше, просто reset_index:

>>> df.groupby(['date', 'job'])[['issue', 'fixed']].sum().reset_index()
         date  job  issue  fixed
0  2020-02-01  ABC    2.0    1.0
1  2020-02-01  DEF    1.0    1.0
...