Pandas合并CSV文件 对齐同名条目计算数值差值
问题根因
用pd.concat做横向拼接是按行位置硬绑定,不会根据Names字段做匹配对齐,只要两个表的条目顺序不一致、存在单表独有条目,必然出现行错位,你遇到的pineapple条目串位、差值计算错误就是这个逻辑导致的。
实现方案
核心是用外连接(outer join) 替代横向拼接,按名称字段做匹配合并,单独拆分处理总计行避免匹配逻辑干扰,步骤如下:
- 读入Q1、Q2数据后分别重命名列,给两个表的同名列加上季度前缀,避免列名冲突
- 提前把两个表的总计行拆分出来单独存放,剩下的普通业务条目走合并逻辑
- 对普通条目做外连接合并,自动把同名条目对齐到同一行,两个季度独有的条目也会单独成行不会丢失
- 按规则填充缺失值:Q2独有行的
Q1Count填0、Q1Names留空;Q1独有行的Q2Count填0、Q2Names留空 - 逐行计算差值列,单独计算总计行的差值后拼接到结果末尾,调整列顺序导出即可
可直接复用的代码
import pandas as pd # 1. 读入数据并重命名列 df_q1 = pd.read_csv("q1_stats.csv").rename(columns={"Names": "Q1Names", "Count": "Q1Count"}) df_q2 = pd.read_csv("q2_stats.csv").rename(columns={"Names": "Q2Names", "Count": "Q2Count"}) # 2. 拆分总计行(如果你的总计行名称不是"总计",替换成实际值即可) q1_total = df_q1[df_q1["Q1Names"] == "总计"] q2_total = df_q2[df_q2["Q2Names"] == "总计"] df_q1_data = df_q1[df_q1["Q1Names"] != "总计"] df_q2_data = df_q2[df_q2["Q2Names"] != "总计"] # 3. 外连接按名称对齐条目 merged_data = pd.merge( df_q1_data, df_q2_data, left_on="Q1Names", right_on="Q2Names", how="outer" ) # 4. 按规则填充缺失值 merged_data["Q1Count"] = merged_data["Q1Count"].fillna(0) merged_data["Q1Names"] = merged_data["Q1Names"].fillna("") merged_data["Q2Count"] = merged_data["Q2Count"].fillna(0) merged_data["Q2Names"] = merged_data["Q2Names"].fillna("") # 5. 计算普通行差值 merged_data["Difference"] = merged_data["Q2Count"] - merged_data["Q1Count"] # 6. 处理总计行差值 q1_total_cnt = q1_total["Q1Count"].iloc[0] if not q1_total.empty else 0 q2_total_cnt = q2_total["Q2Count"].iloc[0] if not q2_total.empty else 0 total_row = pd.DataFrame([{ "Q1Names": "总计" if not q1_total.empty else "", "Q1Count": q1_total_cnt, "Q2Names": "总计" if not q2_total.empty else "", "Q2Count": q2_total_cnt, "Difference": q2_total_cnt - q1_total_cnt }]) # 7. 拼接结果、调整列顺序后导出 final_result = pd.concat([merged_data, total_row], ignore_index=True)[ ["Q1Names", "Q1Count", "Q2Names", "Q2Count", "Difference"] ] final_result.to_csv("quarter_count_diff.csv", index=False, encoding="utf-8-sig")
效果说明
- 所有同名条目自动对齐,不会出现行错位问题,
pineapple这类Q2独有条目会自动补全Q1侧的0值和空名称 - 原文件的总计行完整保留在结果末尾,差值计算逻辑和普通条目一致
- 导出文件用
utf-8-sig编码,直接用Excel打开不会出现中文乱码
内容的提问来源于stack exchange,提问作者noobCoder
相关产品推荐
相关产品推荐

