Python中如何用drop_duplicates提取两个CSV文件的差异行?
CSV文件对比与差异行提取方案
问题分析
你当前代码执行后仍保留10000行,核心原因有两个:
- 两个文件中不存在完全重复的行(可能是列顺序、隐形字符、格式差异导致看似相同的行被判定为不同);
- 原逻辑是合并去重保留所有唯一行,但你需要的是仅在单个文件中出现的差异行,而非所有唯一行。
正确实现方式
方法一:外连接标记法(直观易理解)
通过外连接合并并标记行的来源,精准筛选差异行:
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
相关产品推荐
相关产品推荐

