本文教你使用 pandas 一步到位地读取、对齐、合并结构不一致的 csv 和 excel 数据,并生成含差异值及条件标记的新表格。
本文教你使用 pandas 一步到位地读取、对齐、合并结构不一致的 csv 和 excel 数据,并生成含差异值及条件标记的新表格。
在实际数据比对任务中,常需整合来源不同、列名不统一、日期格式各异的文件(如 CSV 与 Excel),并快速定位关键字段间的数值偏差。本教程以一个典型场景为例:CSV 文件含列 test date、id、values 1;Excel 文件(表头位于第 5 行)含列 id、date(格式为 3/12/2024)、values 2。目标是按 id 关联两条记录,统一日期格式,计算 values 2 - values 1 的差值,并标记“是否超过 2”。
以下是完整、可直接运行的解决方案:
import pandas as pd
# 1. 分别读取 CSV 和 Excel(跳过前4行,使第5行为列名)
df_csv = pd.read_csv("test.csv")
df_excel = pd.read_excel("test.xlsx", skiprows=4)
# 2. 标准化列名,便于后续合并
df_csv = df_csv.rename(columns={"test date": "date", "values 1": "value_1"})
df_excel = df_excel.rename(columns={"values 2": "value_2"})
# 3. 统一日期格式:将 Excel 中的 date 转为 YYYY-MM-DD 字符串(与 CSV 一致)
df_excel["date"] = pd.to_datetime(df_excel["date"]).dt.strftime("%Y-%m-%d")
# 4. 基于 'id' 和 'date' 双键合并(推荐:避免仅用 id 导致多对一歧义)
merged = pd.merge(df_csv, df_excel, on=["id", "date"], how="inner")
# 5. 构建结果表,计算差异并添加布尔标记
result = merged[["date", "id", "value_1", "value_2"]].copy()
result["discrepancy"] = result["value_2"] - result["value_1"]
result["Over 2?"] = result["discrepancy"] > 2 # 自动转为布尔值,可选 .map({True: "yes", False: "no"})
print(result)注意事项:
- 若 Excel 表头不在第 5 行,请调整 skiprows 参数;可用 header=None + iloc 手动指定;
- 使用双键合并(on=["id", "date"])比单键更鲁棒,能防止同 ID 多日期导致的笛卡尔积;
- pd.to_datetime(...).dt.strftime() 确保日期格式完全对齐,避免字符串比较失败;
- "Over 2?" 列默认为布尔型(True/False),如需显示 "yes"/"no",可在最后追加:
result["Over 2?"] = result["Over 2?"].map({True: "yes", False: "no"}) - 最终结果可导出为新 Excel:result.to_excel("discrepancy_report.xlsx", index=False)。
该流程兼顾健壮性与可读性,适合初学者快速上手,也适用于日常数据稽核与自动化报表场景。

















