如何使用groupby agg和重命名所有列的函数

时间:2016-07-14 19:06:34

标签: python pandas group-by

问题

如何在不为每列分配功能字典的情况下获得以下结果?

df.groupby(level=0).agg({'one': {'SUM': 'sum', 'HowMany': 'count'},
                         'two': {'SUM': 'sum', 'HowMany': 'count'}})

enter image description here

到目前为止我做了什么

考虑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

enter image description here

我想使用groupby().agg()来运行一组函数并重命名它们的输出列。

这很好用。

df.groupby(level=0).agg({'one': {'SUM': 'sum', 'HowMany': 'count'}})

enter image description here

但是我想为所有列做这个。我能做到这一点:

df.groupby(level=0).agg(['sum', 'count'])

enter image description here

但是我错过了我所做的伟大重命名。我希望这会奏效:

df.groupby(level=0).agg({'SUM': 'sum', 'HowMany': 'count'})

但它没有。我收到这个错误:

KeyError: 'SUM'

这是有道理的。 Pandas正在查看传递字典的键名列。这就是我开始工作的例子。

3 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分: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

答案 2 :(得分:1)

这是一个难看的答案:

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)

enter image description here