
本文介绍如何比对两个Pandas DataFrame(分别代表报废清单与仓库库存),识别sap_scrapped中存在但sap_warehouse中缺失的物料,并将其以指定默认值(SSP=0)和对应报废量自动追加至仓库表。
本文介绍如何比对两个pandas dataframe(分别代表报废清单与仓库库存),识别`sap_scrapped`中存在但`sap_warehouse`中缺失的物料,并将其以指定默认值(ssp=0)和对应报废量自动追加至仓库表。
在实际数据集成场景中,常需将新采集的业务数据(如当日报废物料)同步补全到主参考表(如仓库主数据表)中,确保后续分析不因键值缺失而中断。本教程提供一种轻量、可靠且无需额外依赖复杂工具的纯 Pandas 实现方案。
核心思路
-
识别缺失物料:基于
Material列,在sap_scrapped中查找未出现在sap_warehouse中的记录; -
构造补全行:为每个缺失物料创建新行,
SSP填 0,Scrapped取自sap_scrapped原值; -
安全追加:使用
pd.concat()合并原表与新增行,重置索引保证结构整洁。
✅ 推荐实现(纯 Pandas,简洁高效)
import pandas as pd
# 示例数据(模拟 API JSON 解析结果)
sap_scrapped = pd.DataFrame({
"Material": ["08-008099-00", "10-000001-00"],
"Scrapped": [2, 5]
})
sap_warehouse = pd.DataFrame({
"Material": ["10-000001-00", "10-789001-00"],
"SSP": [0, 10],
"Scrapped": [0, 7]
})
# 步骤1:找出 sap_scrapped 中不在 sap_warehouse.Material 中的物料
missing_mask = ~sap_scrapped["Material"].isin(sap_warehouse["Material"])
missing_rows = sap_scrapped[missing_mask].copy()
# 步骤2:补全字段 —— 添加 SSP=0,保留原有 Scrapped
missing_rows["SSP"] = 0
# 步骤3:按列顺序对齐(确保与 sap_warehouse 列顺序一致)
missing_rows = missing_rows[["Material", "SSP", "Scrapped"]]
# 步骤4:合并(追加)并重置索引
sap_warehouse_updated = pd.concat(
[sap_warehouse, missing_rows],
ignore_index=True
)
print(sap_warehouse_updated)
输出结果:
Material SSP Scrapped 0 10-000001-00 0 0 1 10-789001-00 10 7 2 08-008099-00 0 2
⚠️ 注意事项
-
列名与类型一致性:确保两表
Material列数据类型相同(建议统一为str),避免因空格、大小写或隐式类型转换导致匹配失败;可提前执行sap_scrapped["Material"] = sap_scrapped["Material"].astype(str).str.strip()。 -
去重处理:若
sap_scrapped存在重复Material,上述逻辑会全部插入;如需去重,可在步骤1前添加sap_scrapped.drop_duplicates(subset="Material", keep="first")。 -
性能提示:对于超大规模数据(百万级+),可改用
set预计算warehouse_materials = set(sap_warehouse["Material"]),再用列表推导快速筛选,显著提升效率。 -
避免原地修改:始终基于副本操作(如
.copy()),防止意外污染原始数据。
该方法不依赖第三方比对库,代码直观、易于调试与维护,适用于绝大多数 ETL 补全场景。如后续需扩展差异审计(如标记新增/更新/删除),再引入 data-fingerprint 或 pandas.testing.assert_frame_equal 等专业工具即可。










