首页 > 解决方案 > Pandas 聚合分组和求和

问题描述

我有一个 pandas 数据框,我试图根据分组求和,但我似乎无法正确排序。在下面的示例中,我想对 group2 然后 group1 进行分组并求和,而不重复计算 group1 的值。这是一个更大的表的一部分,还有其他事情发生,所以我不想通过唯一的 group1-2 集过滤掉。

使用熊猫 1.0.5

x, y = [(21643,21665,21640,21668,21713,21706), (30,28,84,2,32,-9)]
val = [11,27,31,15,50,35]
group1, group2 = [(1,1,3,4,1,4), (21660,21660,21660,21660,21700,21700)]

df = pd.DataFrame(list(zip(x, y, val, group1, group2)), 
                  columns =['x', 'y', 'val', 'group1', 'group2']
                 ) 

df.reset_index(drop=True, inplace=True)
df.sort_values(['group2', 'group1'],inplace=True)
df['group1_mean'] = df.groupby(['group2', 'group1'])['val'].transform('mean')
df['group2_sum'] = df.groupby(['group2', 'group1'])['group1_mean'].transform('sum')
display(df)

在此处输入图像描述

标签: pythonpandaspandas-groupby

解决方案


我会做一个临时的df

dfsum = df.groupby(['group2', 'group1']).mean()
dfsum = dfsum.groupby('group2').sum()

然后将 df 与这个 dfsum 合并

df = df.merge(dfsum, on='group2')

单线技巧

df = df.merge(df.groupby(['group2', 'group1']).val.mean()
    .groupby('group2').sum().rename('result'), on='group2')

这不会分配新的变量名称,因此 groupby 中间 dfs 将被垃圾收集。

输出

       x   y  val  group1  group2  result
0  21643  30   11       1   21660      65
1  21665  28   27       1   21660      65
2  21640  84   31       3   21660      65
3  21668   2   15       4   21660      65
4  21713  32   50       1   21700      85
5  21706  -9   35       4   21700      85

推荐阅读