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')
)