Подсчитать количество категорий после GROUP BY в SQL или Pandas - PullRequest
4 голосов
/ 11 марта 2020

У меня есть датафрейм df:

ORDERID    PRODUCTTYPE  PRODUCTID  PRODUCT
123         Fruits         2       Banana
123         Vegetables     3       Tomato
123         Vegetables     3       Onion
321         Fruits         2       Grapes
321         Fruits         2       Avocado

Мне нужен вывод как

ORDERID  FRUITS  VEGETABLES
123       1          2
321       2          0

Есть ли какие-либо изменения, которые мне нужно выполнить для группы? Я делаю

df.groupby('ORDERID'['PRODUCTTYPE'].nunique().reset_index(name="count")

, но это просто подсчет количества категорий

Ответы [ 4 ]

3 голосов
/ 11 марта 2020

В SQL вы можете использовать условное агрегирование:

select
    orderid,
    sum(case when producttype = 'Fruits' then 1 else 0 end) fruits,
    sum(case when producttype = 'Vegetables' then 1 else 0 end) vegetables
from mytable
group by orderid

Или, если ваша база данных поддерживает современное предложение filter для агрегирования функций:

select
    orderid,
    count(*) filter(where producttype = 'Fruits') fruits,
    count(*) filter(where producttype = 'Vegetables') vegetables
from mytable
group by orderid
3 голосов
/ 11 марта 2020

Комбинация groupby().value_counts() и unstack():

(df.groupby('ORDERID')['PRODUCTTYPE']
   .value_counts()
   .unstack('PRODUCTTYPE', fill_value=0)
)

Или pivot_table:

df.pivot_table(index='ORDERID', 
               columns='PRODUCTTYPE', 
               values='PRODUCTID', 
               aggfunc='count',
               fill_value=0)

Выход:

PRODUCTTYPE  Fruits  Vegetables
ORDERID                        
123               1           2
321               2           0
1 голос
/ 11 марта 2020

Одна функция в pandas pd.crosstab

pd.crosstab(df.ORDERID,df.PRODUCTTYPE)
PRODUCTTYPE  Fruits  Vegetables
ORDERID                        
123               1           2
321               2           0
1 голос
/ 11 марта 2020
select 
ORDERID,
count(Fruits) over (partition by ORDERID) as Fruits,
count(Vegetables) over (partition by ORDERID) as Vegetables
from 
table
group by ORDERID; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...