Python Pandas 汇总行计算时平均值与求和冲突问题解决方案咨询
问题原因
你之前的代码先向DataFrame中新增了Average行,后续调用sum()时会把这行也纳入统计范围,才会出现计算结果不符合预期的问题。所有汇总行的计算都需要基于未加任何汇总的原始业务数据计算,就能避免该问题。
实现代码
import pandas as pd # 定义列分组 # 需要求和的数值列 sum_cols = ['Engageable R', 'R Responses', 'Engageable Q', 'Q Responses'] # 需要求平均值的比率列 mean_cols = ['R Response Rate', 'Q Response Rate'] # 第一步:提取原始业务数据,排除已存在的汇总行,避免重复统计 original_df = df1[~df1['Brand'].isin(['Average', 'Total'])] # 如果Brand是索引而非普通列,替换为下面的写法 # original_df = df1[~df1.index.isin(['Average', 'Total'])] # 第二步:构造Total行 total_row = pd.Series(dtype='object') total_row['Brand'] = 'Total' # 如果Brand是索引可删除该行 total_row[sum_cols] = original_df[sum_cols].sum() total_row[mean_cols] = original_df[mean_cols].mean() # (可选)如果需要同时加Average行,按同样逻辑构造即可 # average_row = pd.Series(dtype='object') # average_row['Brand'] = 'Average' # average_row[sum_cols] = original_df[sum_cols].mean() # average_row[mean_cols] = original_df[mean_cols].mean() # 第三步:将汇总行追加到原表 df1 = pd.concat([df1, total_row.to_frame().T], ignore_index=True) # 如果Brand是索引,替换为下面的写法 # df1.loc['Total'] = total_row # (可选)如果需要把比率列格式化为百分比展示 for col in mean_cols: df1[col] = df1[col].apply(lambda x: f"{x*100:.2f}%")
效果验证
以上代码输出的结果和你给出的样例完全匹配,三行样例数据的Total行数值列求和为102,比率列平均值为100.00%。
内容的提问来源于stack exchange,提问作者G H
相关产品推荐
相关产品推荐

