python - 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)
解决方案
我会做一个临时的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
推荐阅读
- stata - 在 stata 的同一观察中创建变量组
- java - 使用 lombok 和 jackson 预处理 json
- python - 如何在多个环境中重用 python 脚本(在 Pycharm 中)
- django - 在模板中调用嵌套/子表单的特定字段
- yocto - “/tmp”临时目录中没有足够的磁盘空间。启动需要 100 MB
- flutter - 如何用颤振绘制这个形状
- javascript - 将 forEach 用于对象时,如何按顺序获取对象?
- python - 将一个字符串与另一个字符串的多个子字符串进行比较
- java - 您可以将文本字段中的字节转换为字符串吗?
- android - 如果片段不可见,如何关闭片段