如何使用pandas计算两个CSV文件之间的差异
用Pandas对比两个CSV文件差异的实现方法
第一步:读取两个CSV文件
首先导入pandas并加载目标文件:
import pandas as pd # 读取两个待对比的CSV文件 df_a = pd.read_csv("第一个文件路径.csv") df_b = pd.read_csv("第二个文件路径.csv")
前置检查:请先确保两个CSV的列名保持一致,如果列有差异请先做列筛选/重命名对齐后再执行后续对比。
场景1:存在唯一主键列(推荐,对比结果更清晰)
如果两个表存在唯一标识列(比如订单ID、用户ID),可按主键对齐后对比字段差异:
- 把主键设为索引,方便对齐记录
# 这里假设公共主键为`id`,可替换为实际的主键列名 df_a = df_a.set_index("id") df_b = df_b.set_index("id")
- 生成差异掩码,标记出值不一样的位置
diff_mask = df_a.ne(df_b)
- 提取差异记录,合并两个文件的对应值方便对照
# 筛选出至少有一个字段存在差异的行,分别重命名列标记来源后合并 diff_df = df_a[diff_mask.any(axis=1)].add_prefix("文件1_").join( df_b[diff_mask.any(axis=1)].add_prefix("文件2_") ).reset_index()
最终输出的diff_df会包含主键列、两个文件对应差异字段的数值,一目了然。
场景2:无主键,逐行对比全量内容
如果两个CSV没有唯一标识,仅需要找出两个文件中内容不一致/仅在单个文件存在的行:
- 给两个表加来源标记,后续方便区分行来自哪个文件
df_a["source"] = "文件1" df_b["source"] = "文件2"
- 合并后去重,仅保留出现过一次的行(就是有差异的行)
combined = pd.concat([df_a, df_b], ignore_index=True) # 排除source列判断行内容是否完全相同 compare_cols = combined.columns.drop("source") diff_df = combined.drop_duplicates(subset=compare_cols, keep=False).sort_values(by=compare_cols.tolist())
最终diff_df中会展示所有差异行,source列标记该行所属的文件。
可选:保存差异结果
如果需要把差异DataFrame导出为新的CSV,执行以下代码即可:
diff_df.to_csv("对比差异结果.csv", index=False)
内容的提问来源于stack exchange,提问作者mhordflyer
相关产品推荐
相关产品推荐

