Как использовать функции 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)

Другие вопросы по тегам