Python pandas groupby:我可以按列多索引的一个级别选择agg函数吗?

Python pandas groupby:我可以按列多索引的一个级别选择agg函数吗?,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个包含多个列索引的熊猫数据框架: columns=pd.MultiIndex.from\u元组( [(c,i)表示在[a',b']中的c,表示在范围(3)中的i]) df=pd.DataFrame(np.random.randn(4,6), 索引=[0,0,1,1], 列=列) 打印(df) a b 0 1 2 0 1 2 0 0.582804 0.753118 -0.900950 -0.914657 -0

我有一个包含多个列索引的熊猫数据框架:

columns=pd.MultiIndex.from\u元组(
[(c,i)表示在[a',b']中的c,表示在范围(3)中的i])
df=pd.DataFrame(np.random.randn(4,6),
索引=[0,0,1,1],
列=列)
打印(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'聚合

我知道我可以通过创建一个dict来实现这一点,该dict为每列指定agg函数:

agg_dict={'a':'min','b':'sum'}
full_agg_dict={(c,i):agg_dict[c]表示范围(3)中的i在['a','b']中的c]
打印(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\u dict
而不使用
full\u agg\u dict

我也会使用您的方法。但这里有另一种方法(应该)起作用:

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

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

第一个解决方案不适用于此数据帧的原因是,原始数据帧的索引是一个1D形状数组
(4,)
如果通过,它会很好地工作。@ALollz同意。这也是我一开始说的。@SIA这是
stack
的一个错误。当索引有重复值时,代码创建错误(然后在groupby中使用)。
stack
当前只使用
新代码=[np.arange(N)。重复(levsize)]
生成忽略重复的新代码。我不知道是否有更简单的方法。如果字典没有遵循完美的模式,可能只是让它更灵活(更容易阅读):
{x:agg_dict[x[0]]for x in df.columns}
(df.stack(level=1)
   .reset_index()
   .groupby(['level_0','level_1'])
   .agg({'a':'min','b':'sum'})
   .unstack('level_1')
)