Как использовать функции groupby agg и переименовать для всех столбцов
Вопрос
Как получить следующий результат без необходимости назначения словаря функций для каждого столбца?
df.groupby(level=0).agg({'one': {'SUM': 'sum', 'HowMany': 'count'},
'two': {'SUM': 'sum', 'HowMany': 'count'}})
Что я сделал до сих пор
Рассмотрим df
:
import pandas as pd
import numpy as np
idx = pd.MultiIndex.from_product([['A', 'B'], ['One', 'Two']],
names=['Alpha', 'Numeric'])
df = pd.DataFrame(np.arange(8).reshape(4, 2), idx, ['one', 'two'])
df
Я хочу использовать groupby().agg()
где я запускаю набор функций и переименовываю их выходные столбцы.
Это отлично работает.
df.groupby(level=0).agg({'one': {'SUM': 'sum', 'HowMany': 'count'}})
Но я хочу сделать это для всех столбцов. Я мог бы сделать это:
df.groupby(level=0).agg(['sum', 'count'])
Но я пропускаю великолепное переименование, которое я сделал. Я надеялся, что это сработает:
df.groupby(level=0).agg({'SUM': 'sum', 'HowMany': 'count'})
Но это не так. Я получаю эту ошибку:
KeyError: 'SUM'
Это имеет смысл. Pandas просматривает ключи переданного словаря для имен столбцов. Вот как я получил пример в начале работы.
3 ответа
Решение
Использует .rename()
вариант для вас?
In [7]: df.groupby(level=0).agg(['sum', 'count']).rename(columns=dict(sum='SUM', count='HowMany'))
Out[7]:
one two
SUM HowMany SUM HowMany
Alpha
A 2 2 4 2
B 10 2 12 2
Ты можешь использовать set_levels
:
g = df.groupby(level=0).agg(['sum', 'count'])
g.columns.set_levels(['SUM', 'HowMany'], 1, inplace=True)
g
>>>
one two
SUM HowMany SUM HowMany
Alpha
A 2 2 4 2
B 10 2 12 2
Это уродливый ответ:
gb = df.stack(0).groupby(level=[0, -1])
df1 = gb.agg({'SUM': 'sum', 'HowMany': 'count'})
df1.unstack().swaplevel(0, 1, 1).sort_index(1, 0)