
本文介绍如何对比两个Pandas DataFrame(分别代表报废数据和仓库主表),识别Material列中存在于报废表但缺失于仓库表的记录,并将其以指定默认值(如SSP=0)和对应Scrapped值自动追加到仓库表中。
本文介绍如何对比两个pandas dataframe(分别代表报废数据和仓库主表),识别`material`列中存在于报废表但缺失于仓库表的记录,并将其以指定默认值(如`ssp=0`)和对应`scrapped`值自动追加到仓库表中。
在实际ERP或MES数据同步场景中,常需将临时采集的报废物料清单(sap_scrapped)与主仓库物料表(sap_warehouse)对齐,确保所有被报废的物料均已在主表中存在——即使其SSP(安全库存水平)尚未录入。此时,核心需求是:仅补充缺失的Material行,保留原有字段结构,并按规则填充新列值。
推荐使用原生Pandas实现,无需引入额外依赖(如data-fingerprint),简洁、可控且兼容性高。以下是标准解决方案:
✅ 步骤一:识别缺失物料
利用isin()配合布尔索引,快速筛选出sap_scrapped中未出现在sap_warehouse的Material:
# 获取 sap_scrapped 中不在 sap_warehouse 的物料 missing_mask = ~sap_scrapped["Material"].isin(sap_warehouse["Material"]) missing_df = sap_scrapped[missing_mask].copy()
✅ 步骤二:构造待插入行(补齐字段)
sap_warehouse含三列:Material、SSP、Scrapped。新行需:
- 保留
Material和Scrapped(来自missing_df); - 新增
SSP列,统一设为0(或其他业务默认值)。
# 添加 SSP 列并设为 0,保持列顺序与 sap_warehouse 一致 missing_df["SSP"] = 0 missing_df = missing_df[["Material", "SSP", "Scrapped"]] # 显式排序列
✅ 步骤三:合并数据(追加至原表)
使用pd.concat()沿行方向拼接,重置索引确保整洁:
sap_warehouse_updated = pd.concat(
[sap_warehouse, missing_df],
ignore_index=True
)
? 验证效果:对示例数据运行后,
sap_warehouse_updated将新增一行:Material='08-008099-00',SSP=0,Scrapped=2—— 完全符合预期。
⚠️ 注意事项
-
去重保障:若
sap_scrapped本身含重复Material,建议先去重:sap_scrapped.drop_duplicates(subset="Material", keep="first"); -
数据类型一致性:确保两表
Material列均为字符串类型(如astype(str)),避免因数值型/字符串混用导致匹配失败; -
性能优化:当数据量极大(>10万行)时,可改用
set预计算warehouse_materials = set(sap_warehouse["Material"]),再用列表推导高效过滤; -
空值处理:若
Material列含NaN,isin()会返回False,需提前清洗(如dropna(subset=["Material"]))。
该方法逻辑清晰、无外部依赖、易于调试与维护,是生产环境中推荐的轻量级数据对齐实践。










