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