Как использовать агрегатные функции Pandas в этом DataFrame? - PullRequest
0 голосов
/ 16 мая 2019

Это таблица:

order_id    product_id  reordered   department_id
2           33120       1           16
2           28985       1           4
2           9327        0           13
2           45918       1           13
3           17668       1           16
3           46667       1           4
3           17461       1           12
3           32665       1           3
4           46842       0           3

Я хочу сгруппировать по отделу_иде, суммируя количество заказов, поступающих из этого отдела, а также количество заказов из того отдела, в котором было выполнено реорганизация == 0Получившаяся таблица выглядела бы так:

department_id     number_of_orders     number_of_reordered_0
3                 2                    1
4                 2                    0
12                1                    0
13                2                    1
16                2                    0

Я знаю, что это можно сделать в SQL (я забыл, как будет выглядеть запрос для этого, если кто-нибудь может обновить мою память на этом, чтобыло бы тоже здорово).Но каковы функции Панд, чтобы заставить это работать?

Я знаю, что это начинается с df.groupby ('Department_id'). Sum ().Не уверен, как конкретизировать остальную часть строки.

Ответы [ 2 ]

1 голос
/ 16 мая 2019

в sql это была бы простая агрегация

select department_id,count(*) as number_of_orders,
sum(case when reordered=0 then 1 else 0 end) as number_of_reordered_0
from tabl_name
group by department_id
1 голос
/ 16 мая 2019

Используйте GroupBy.agg с DataFrameGroupBy.size и лямбда-функцию для сравнения значений по Series.eq и подсчета sum из True значений (True s - это процессы, подобные 1):

df1 = (df.groupby('department_id')['reordered']
         .agg([('number_of_orders','size'), ('number_of_reordered_0',lambda x: x.eq(0).sum())])
         .reset_index())
print (df1)
   department_id  number_of_orders  number_of_reordered_0
0              3                 2                      1
1              4                 2                      0
2             12                 1                      0
3             13                 2                      1
4             16                 2                      0

Если значения только 1 и 0 возможно, используйте sum и последнее вычитание:

df1 = (df.groupby('department_id')['reordered']
         .agg([('number_of_orders','size'), ('number_of_reordered_0','sum')])
         .reset_index())

df1['number_of_reordered_0'] = df1['number_of_orders'] - df1['number_of_reordered_0']
print (df1)
   department_id  number_of_orders  number_of_reordered_0
0              3                 2                      1
1              4                 2                      0
2             12                 1                      0
3             13                 2                      1
4             16                 2                      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...