Рассмотрим следующую таблицу.
+--------+-----------+-------------+
| group | numerical | categorical |
+--------+-----------+-------------+
| group1 | 23 | cat1 |
| group1 | 31 | cat1 |
| group1 | 10 | cat2 |
| group2 | 23 | cat1 |
| group2 | 51 | cat2 |
| group2 | 03 | cat2 |
+--------+-----------+-------------+
Я хочу сгруппировать по столбцу group
и получить следующую выходную таблицу, которая дает count
каждой категории в столбце categorical
в виде отдельных столбцов.
+--------+---------------+-----------------------+-----------------------+
| group | numerical_sum | categorical_cat1_size | categorical_cat2_size |
+--------+---------------+-----------------------+-----------------------+
| group1 | 64 | 2 | 1 |
| group2 | 77 | 1 | 2 |
+--------+---------------+-----------------------+-----------------------+
Для числового столбца мы можем агрегировать и sum
, но как мы можем получить количество значений каждой категории в столбце categorical
в виде отдельного столбца?
Обратите внимание, что использование pd.value_counts
не помогает, так как дает следующий результат.
pd.groupby(by='group').agg({
'numerical': 'sum',
'categorical': pd.value_counts
})
+--------+---------------+-------------+
| group | numerical_sum | categorical |
+--------+---------------+-------------+
| group1 | 64 | [2,1] |
| group2 | 67 | [1,2] |
+--------+---------------+-------------+
Ты можешь использовать:
out = pd.concat([df.groupby('group')['numerical'].sum().rename('numerical_sum'),
df.value_counts(['group', 'categorical']).unstack()
.add_prefix('categorical_').add_suffix('_size')],
axis=1).reset_index()
print(out)
# Output
group numerical_sum categorical_cat1_size categorical_cat2_size
0 group1 64 2 1
1 group2 77 1 2