如何按分组计算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.
相关产品推荐
相关产品推荐

