熊猫汇总分组和汇总

时间:2020-08-04 19:37:20

标签: python pandas pandas-groupby

我有一个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)

enter image description here

1 个答案:

答案 0 :(得分:2)

我会做一个临时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