You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不拆分DataFrame的前提下添加按分组聚合的占比列?

问题描述

我有如下DataFrame:

# 创建DataFrame
raw_data = {'trial_num': ['1', '1', '2', '2', '3', '3'], 'area': ['first', 'second', 'first', 'second','first','second'], 'counts': [10, 25, 36, 2, 70, 10]}
df = pd.DataFrame(raw_data, columns = ['trial_num', 'area', 'counts'])

对应的DataFrame内容:

trial_num area counts
0        1 first     10
1        1 second    25
2        2 first     36
3        2 second     2
4        3 first     70
5        3 second    10

我希望添加一个新列proportion,用于表示每个count占对应trial_num分组总数的比例,期望结果如下:

trial_num area counts total_count proportion
0        1 first     10         35  0.2857142857142857
1        1 second    25         35  0.7142857142857143
2        2 first     36         38  0.9473684210526315
3        2 second     2         38  0.05263157894736842
4        3 first     70         80  0.875
5        3 second    10         80  0.125

目前我仅完成了分组求和:

df.counts.groupby(df.trial_num).sum()

结果:

trial_num
1    35
2    38
3    80

请问有没有无需拆分DataFrame的高效实现方法?恳请帮助。

解决方案

当然有!你可以用Pandas的transform()方法,它能在不拆分DataFrame的前提下,把分组聚合的结果自动广播回原DataFrame的每一行,完美匹配你的需求。

直接看实操代码:

# 添加total_count列:用transform返回每个trial_num分组的counts总和,自动对齐到原行
df['total_count'] = df.groupby('trial_num')['counts'].transform('sum')
# 计算比例:直接用每行的counts除以对应分组的total_count
df['proportion'] = df['counts'] / df['total_count']

运行这段代码后,你的DataFrame会直接生成total_count和proportion列,完全符合你想要的结果。

这个方法高效的原因在于:transform()内部已经处理了分组结果与原DataFrame的对齐逻辑,不需要你手动拆分再合并,既节省了额外的操作开销,代码也简洁易读,一步到位。

如果想要让比例更美观,还可以用round()指定小数位数,比如保留四位小数:

df['proportion'] = (df['counts'] / df['total_count']).round(4)

内容的提问来源于stack exchange,提问作者Paul Beloff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:50:03