Pandas DataFrame按条件汇总票数生成总票行并删除旧明细行的方法
Pandas 实现按分组补全总票统计行方案
核心逻辑
优先保留原始数据中已有的Mode=TOTAL行,仅对没有提供总票数的分组,用对应明细行的票数汇总生成新的TOTAL行,最终仅保留所有TOTAL行。
实现代码
import pandas as pd # 1. 拆分原始数据中已有的总票行和明细行 exist_total = df[df["Mode"] == "TOTAL"].copy() detail_rows = df[df["Mode"] != "TOTAL"].copy() # 2. 筛选出没有对应总票行的明细数据 # 提取已有总票的分组标识 total_group_keys = exist_total[["State", "County", "Candidate"]].drop_duplicates() # 匹配过滤得到需要计算总票的明细 need_calc_detail = detail_rows.merge( total_group_keys, on=["State", "County", "Candidate"], how="left", indicator=True ).query('_merge == "left_only"').drop(columns="_merge") # 3. 分组汇总生成新的总票行 new_total = need_calc_detail.groupby( ["State", "County", "Candidate"], as_index=False )["CandidateVotes"].sum() new_total["Mode"] = "TOTAL" # 4. 合并原有和新增总票行得到最终结果 final_df = pd.concat([exist_total, new_total], ignore_index=True)
简化场景方案
如果你不需要保留原始提供的TOTAL值,希望所有分组都统一用明细票数求和得到总票,可以直接用下面更简单的代码:
final_df = df.groupby( ["State", "County", "Candidate"], as_index=False )["CandidateVotes"].sum() final_df["Mode"] = "TOTAL"
内容的提问来源于stack exchange,提问作者Acuity
相关产品推荐
相关产品推荐

