如何在不拆分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
相关产品推荐
相关产品推荐

