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

如何按分组计算pandas DataFrame的新增占比列并正确赋值

实现方案

你不需要自行编写for循环处理,直接用pandas内置的groupby.transform即可实现分组内的占比计算,该方法自动适配任意分组大小,且返回的序列和原DataFrame索引完全对齐,不会出现赋值失败的问题。

完整可运行代码

import pandas as pd

# 构造示例数据(对应你给出的第二个测试样例)
df = pd.DataFrame({
    'Group': [1,2,2,2],
    'Col A': [1,1,2,3],
    'Col B': [2,2,2,4]
})

# 核心计算逻辑(如果计算列少可以直接逐行写)
df['Per A'] = df['Col A'] / df.groupby('Group')['Col A'].transform('sum') * 100
df['Per B'] = df['Col B'] / df.groupby('Group')['Col B'].transform('sum') * 100

# 批量计算版本:如果后续要新增更多计算列,用下面的循环更高效,不用重复写代码
# cols_to_calc = ['Col A', 'Col B']
# for col in cols_to_calc:
#     df[f'Per {col.split()[-1]}'] = df[col] / df.groupby('Group')[col].transform('sum') * 100

# 可选:保留两位小数,和你的输出样例格式一致
df = df.round({'Per A':2, 'Per B':2})

print(df)

输出结果

运行后输出和你给出的预期完全一致:

Group  Col A  Col B   Per A  Per B
0      1      1      2  100.00  100.0
1      2      1      2   16.67   25.0
2      2      2      2   33.33   25.0
3      2      3      4   50.00   50.0

原for循环赋值失败的常见原因

你之前用for循环计算后无法赋值,大概率是因为分组遍历得到的子DataFrame索引和原DataFrame索引没有对齐,赋值时pandas匹配不到对应行导致出现空值或者报错。用transform返回的结果和原表索引完全对应,直接赋值即可,不需要额外处理索引匹配问题。

内容的提问来源于stack exchange,提问作者William M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:54:04