Как изменить иерархию уровней при группировке DataFrame?
Предположим есть DataFrame такого вида:
samp = pd.DataFrame({'region': ['North','North','South','South','East','East','West','West'],
'store': list('ABCDEFGH'),
'num': 100,
'year':['2020','2020','2021','2021','2021','2021','2020','2021']})
region store num year
0 North A 100 2020
1 North B 100 2020
2 South C 100 2021
3 South D 100 2021
4 East E 100 2021
5 East F 100 2021
6 West G 100 2020
7 West H 100 2021
Нужно сгруппировать данные регионов по строкам, и года по столбцам.
Делаю это или через pivot_table или groupby, что дает одинаковый результат. Примерно так:
pd.pivot_table(samp, index='region', columns='year',values=['store','num'],
aggfunc={'store': 'count','num':'sum'})
samp.groupby(['region','year']).agg(
total_num=("num","sum"),
stores=("store", "count")).unstack()
Получаем на выходе необходимые данные в таком виде:
total_num stores
year 2020 2021 2020 2021
region
East NaN 200.0 NaN 2.0
North 200.0 NaN 2.0 NaN
South NaN 200.0 NaN 2.0
West 100.0 100.0 1.0 1.0
Можно ли как-то изменить порядок группировки (иерархию?), чтобы получить данные в таком виде (то есть сгруппировать столбцы по годам):
2020 2021
values total_num stores total_num stores
region
East NaN NaN 200.0 2.0
North 200.0 2.0 NaN NaN
South NaN NaN 200.0 2.0
West 100.0 1.0 100.0 1.0
В сводных таблицах Excel это делается легким движением мышки, но здесь я никак не могу найти способ вывести данные в таком виде. swaplevel по сути ничего не меняет.
Mожно ли как-то это сделать?
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Воспользуйтесь DataFrame.swaplevel() и DataFrame.sort_index():
res = (samp
.groupby(['region','year'])
.agg(total_num=("num","sum"),stores=("store", "count"))
.unstack()
.swaplevel(axis=1)
.sort_index(axis=1))
результат:
In [60]: res
Out[60]:
year 2020 2021
stores total_num stores total_num
region
East NaN NaN 2.0 200.0
North 2.0 200.0 NaN NaN
South NaN NaN 2.0 200.0
West 1.0 100.0 1.0 100.0