
本文介绍如何使用pandas高效比对两个结构不同的csv文件(如产品主表与历史数据表),基于sku字段识别新增记录,并导出完整新数据文件及sku清单。
本文介绍如何使用pandas高效比对两个结构不同的csv文件(如产品主表与历史数据表),基于sku字段识别新增记录,并导出完整新数据文件及sku清单。
在电商或库存管理场景中,常需定期从API下载最新产品数据(如 downloaded_data.csv),并与本地已有的历史数据(如 current-data.csv)进行比对,快速定位新增SKU对应的产品行。关键挑战在于:两文件列名、列序、甚至字段含义可能不同(例如新文件用 SKU,旧文件用 ID 表示同一标识),但核心逻辑始终是以SKU为唯一键做集合差集运算。
以下是一个健壮、可复用的完整实现方案:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
✅ 正确做法:基于集合差集筛选新增行
import pandas as pd
# 1. 读取主文件(新数据)——保留全部列,确保后续导出格式一致
master_df = pd.read_csv("downloaded_data.csv")
# 2. 读取历史文件(旧数据)——仅提取用于比对的标识列(注意列名映射)
# 假设 current-data.csv 中标识列为 'ID',而非 'SKU'
legacy_df = pd.read_csv("current-data.csv")
legacy_skus = set(legacy_df["ID"].astype(str).str.strip()) # 统一转为字符串并去空格,防类型/空格不一致
# 3. 提取主文件中的SKU列(确保类型一致)
master_skus = set(master_df["SKU"].astype(str).str.strip())
# 4. 计算新增SKU:存在于master但不在legacy中的SKU
new_skus = master_skus - legacy_skus
# 5. 筛选主文件中所有新增SKU对应的完整行(保留原始全部列)
new_products_df = master_df[master_df["SKU"].astype(str).str.strip().isin(new_skus)].copy()
# 6. 导出结果
new_products_df.to_csv("new-products.csv", index=False, encoding="utf-8-sig") # utf-8-sig 支持Excel中文
pd.DataFrame({"SKU": list(new_skus)}).to_csv("comparison-file.csv", index=False, encoding="utf-8-sig")
⚠️ 原代码问题解析与规避要点
-
错误根源:原代码中
usecols=[29]和usecols=[5]强依赖列索引,极易因文件结构调整而失效;且pd.merge(..., how='left', indicator=True)后未正确关联原始主表行,导致后续文本逐行匹配逻辑失效(line.split(',')[0].strip() not in comparison_result实际在判断字符串是否在DataFrame对象中,永远为True)。 -
关键改进:
- ✅ 弃用列索引读取 → 改用列名读取(
read_csv(..., usecols=["SKU"])或直接全量读取后筛选); - ✅ 统一数据类型与格式 → 对SKU列强制
astype(str).str.strip(),避免'SKU123'与' SKU123 '或数值型123匹配失败; - ✅ 用集合运算替代复杂合并 →
set(A) - set(B)时间复杂度 O(n+m),远快于merge + query,且语义清晰、不易出错; - ✅ 直接布尔索引筛选 →
master_df[condition]一步获取带全部原始列的新数据子集,无需手动逐行IO。
- ✅ 弃用列索引读取 → 改用列名读取(
? 补充建议
- 若历史文件无明确
ID列,但存在其他等价字段(如product_code,item_id),请在legacy_df["ID"]处替换为对应列名; - 如需处理超大文件(百万级行),可改用
dask或分块读取(chunksize),但集合差集仍推荐先抽样SKU列构建轻量set; - 导出时使用
encoding="utf-8-sig"可避免Windows Excel打开乱码(尤其含中文时)。
通过该方法,你将精准获得 new-products.csv(含原始全部列)和 comparison-file.csv(纯SKU清单),真正实现“一次比对、双结果输出”的自动化目标。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










