【问题标题】:pandas groupby: can I select an agg function by one level of a column MultiIndex?pandas groupby:我可以通过 MultiIndex 列的一级选择 agg 函数吗?
【发布时间】:2019-09-06 01:40:56
【问题描述】:

我有一个带有 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 函数的 dict 来做到这一点:

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

【问题讨论】:

  • 不知道有没有更简单的。如果字典不遵循完美的模式,可能只是让字典更灵活(更容易阅读):{x: agg_dict[x[0]] for x in df.columns}

标签: python pandas pandas-groupby


【解决方案1】:

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

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

【讨论】:

  • 第一个解决方案不适用于此数据帧的原因是因为原始数据帧的索引是形状为(4,) 的一维数组。如果改为传递一个二维数组 (index=[[0, 0, 1, 1]]),它会正常工作。
  • @ALollz 同意了。我一开始也是这么说的。
  • @SIA 这是stack 的错误。当索引具有重复值时,代码创建不正确(然后在 groupby 中使用)。 stack 目前只使用new_codes = [np.arange(N).repeat(levsize)] 生成新代码,忽略了欺骗。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多