pandas groupby:我可以通过一列MultiIndex来选择agg函数吗?

时间:2019-09-05 17:11:42

标签: python pandas pandas-groupby

我有一个带有列MultiIndex的pandas DataFrame:

columns=pd.MultiIndex.from_tuples(
    [(c, i) for c in ['a', 'b'] for i in range(3)])
df = pd.DataFrame(np.random.randn(4, 6),
                  index=[0, 0, 1, 1],
                  columns=columns)
print(df)

          a                             b                    
          0         1         2         0         1         2
0  0.582804  0.753118 -0.900950 -0.914657 -0.333091 -0.965912
0  0.498002 -0.842624  0.155783  0.559730 -0.300136 -1.211412
1  0.727019  1.522160  1.679025  1.738350  0.593361  0.411907
1  1.253759 -0.806279 -2.177582 -0.099210 -0.839822 -0.211349

我想按索引分组,并在a列上使用'min'聚合,在b列上使用'sum'聚合。

我知道我可以通过创建一个为每个列指定agg函数的字典来做到这一点:

agg_dict = {'a': 'min', 'b': 'sum'}
full_agg_dict = {(c, i): agg_dict[c] for c in ['a', 'b'] for i in range(3)}
print(df.groupby(level=0).agg(full_agg_dict))

          a                             b                    
          0         1         2         0         1         2
0  0.498002 -0.842624 -0.900950 -0.354927 -0.633227 -2.177324
1  0.727019 -0.806279 -2.177582  1.639140 -0.246461  0.200558

有没有更简单的方法?似乎应该有一种方法可以使用agg_dict而不使用full_agg_dict

1 个答案:

答案 0 :(得分:2)

我也会使用您的方法。但是这是(应该)工作的另一种方式:

(df.stack(level=1)
   .groupby(level=[0,1])
   .agg({'a':'min','b':'sum'})
   .unstack(-1)
)

由于某种原因,groupby(level=[0,1]对我不起作用,所以我想到了:

(df.stack(level=1)
   .reset_index()
   .groupby(['level_0','level_1'])
   .agg({'a':'min','b':'sum'})
   .unstack('level_1')
)