如何对比两个Pandas DataFrame并向sap_warehouse插入缺失的物料数据
如何对比两个Pandas DataFrame并向sap_warehouse插入缺失的物料数据
嘿,这个需求其实用Pandas的几个基础方法就能轻松实现,我结合你的示例数据,给你两种直观的解决方案,你可以根据自己的习惯选择:
首先先把你的示例数据用代码还原出来,方便我们直接测试验证:
import pandas as pd # 构建你的 sap_scrapped 示例数据 sap_scrapped = pd.DataFrame({ 'Material': ['08-008099-00', '10-000001-00'], 'Scrapped': [2, 5] }) # 构建你的 sap_warehouse 示例数据 sap_warehouse = pd.DataFrame({ 'Material': ['10-000001-00', '10-789001-00'], 'SSP': [0, 10], 'Scrapped': [0, 7] })
方法一:筛选缺失行后追加(最直接)
这个思路就是先定位sap_scrapped里有但sap_warehouse没有的物料行,处理格式后直接追加到目标DataFrame,步骤清晰易懂:
- 筛选缺失的物料行
用isin()方法判断哪些物料不在sap_warehouse中,取反得到缺失的行:
# 找出 sap_scrapped 中未出现在 sap_warehouse 的物料行 missing_rows = sap_scrapped[~sap_scrapped['Material'].isin(sap_warehouse['Material'])]
- 补全缺失行的SSP列
给这些缺失行添加SSP列,按照需求设为0:
missing_rows['SSP'] = 0
- 对齐列顺序
确保缺失行的列顺序和sap_warehouse完全一致,避免追加时出现列错位问题:
# 调整列顺序为 Material → SSP → Scrapped,和目标DataFrame保持一致 missing_rows = missing_rows[['Material', 'SSP', 'Scrapped']]
- 追加到sap_warehouse
用pd.concat()把缺失行追加进去,记得加上ignore_index=True重置索引:
sap_warehouse_updated = pd.concat([sap_warehouse, missing_rows], ignore_index=True)
运行后打印结果,完全符合你的预期:
Material SSP Scrapped 0 10-000001-00 0 0 1 10-789001-00 10 7 2 08-008099-00 0 2
方法二:外连接合并后填充(适合复杂场景)
如果以后你需要同时处理「缺失物料插入」和「现有数据更新」的需求,用外连接的方法会更灵活:
# 以Material为关联键,执行外连接合并两个DataFrame merged_df = pd.merge( sap_warehouse, sap_scrapped, on='Material', how='outer', suffixes=('_warehouse', '_scrapped') ) # 填充缺失值:SSP缺省设为0,Scrapped缺省用sap_scrapped里的对应值 merged_df['SSP'] = merged_df['SSP'].fillna(0) merged_df['Scrapped_warehouse'] = merged_df['Scrapped_warehouse'].fillna(merged_df['Scrapped_scrapped']) # 整理成目标格式的DataFrame sap_warehouse_updated = merged_df[['Material', 'SSP', 'Scrapped_warehouse']].rename( columns={'Scrapped_warehouse': 'Scrapped'} ).reset_index(drop=True)
这个方法最终得到的结果和方法一完全相同,但扩展性更强——比如如果后续需要更新现有物料的Scrapped值,只需要调整填充逻辑即可。
两种方法都能满足你的需求,选哪个看你当前场景的复杂度就好~
备注:内容来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

