You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何用drop_duplicates提取两个CSV文件的差异行?

CSV文件对比与差异行提取方案

问题分析

你当前代码执行后仍保留10000行,核心原因有两个:

  1. 两个文件中不存在完全重复的行(可能是列顺序、隐形字符、格式差异导致看似相同的行被判定为不同);
  2. 原逻辑是合并去重保留所有唯一行,但你需要的是仅在单个文件中出现的差异行,而非所有唯一行。

正确实现方式

方法一:外连接标记法(直观易理解)

通过外连接合并并标记行的来源,精准筛选差异行:

import pandas as pd

# 读取文件并重置索引,避免索引干扰
oldest_file = pd.read_csv("oldest.csv").reset_index(drop=True)
newest_file = pd.read_csv("newest.csv").reset_index(drop=True)

# 对齐列顺序(确保两个文件列一致)
common_columns = oldest_file.columns.intersection(newest_file.columns)
oldest_file = oldest_file[common_columns]
newest_file = newest_file[common_columns]

# 外连接合并,添加来源标记列
merged = pd.merge(oldest_file, newest_file, how="outer", indicator=True)

# 筛选仅在单个文件中存在的行
diff_rows = merged[merged["_merge"] != "both"].drop(columns="_merge")

# 保存差异行到新文件
diff_rows.to_csv("diff_result.csv", index=False)

方法二:重复标记反向筛选法(代码简洁)

利用duplicated标记所有重复行,反向筛选仅出现一次的差异行:

import pandas as pd

# 读取并预处理文件
oldest_file = pd.read_csv("oldest.csv").reset_index(drop=True)
newest_file = pd.read_csv("newest.csv").reset_index(drop=True)

# 对齐列顺序
common_columns = oldest_file.columns.intersection(newest_file.columns)
oldest_file = oldest_file[common_columns]
newest_file = newest_file[common_columns]

# 合并后筛选仅出现一次的行(即差异行)
merged = pd.concat([oldest_file, newest_file]).reset_index(drop=True)
diff_rows = merged[~merged.duplicated(keep=False)]

# 保存结果
diff_rows.to_csv("diff_result.csv", index=False)

去重无效的排查与修复

如果执行后仍有问题,大概率是数据存在隐形差异,可做以下清洗:

  • 清除字符串空格:
    str_cols = oldest_file.select_dtypes(include=["object"]).columns
    oldest_file[str_cols] = oldest_file[str_cols].apply(lambda x: x.str.strip())
    newest_file[str_cols] = newest_file[str_cols].apply(lambda x: x.str.strip())
    
  • 统一数字格式:
    num_cols = oldest_file.select_dtypes(include=["int64", "float64"]).columns
    oldest_file[num_cols] = oldest_file[num_cols].astype(int)
    newest_file[num_cols] = newest_file[num_cols].astype(int)
    
  • 对齐日期格式:
    date_cols = ["date_column"] # 替换为你的日期列名
    oldest_file[date_cols] = pd.to_datetime(oldest_file[date_cols])
    newest_file[date_cols] = pd.to_datetime(newest_file[date_cols])
    

内容的提问来源于stack exchange,提问作者Matheus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:25:35