如何通过另一DataFrame查询值更新Pandas中某DataFrame的单元格
Pandas实现库存物料编号修正(替代PostgreSQL逻辑)
需求背景
此前在PostgreSQL中实现过库存物料编号修正功能,现改用Pandas完成全流程处理(后续将对接PostgreSQL物料表)。现有两个DataFrame:
stock:记录库存现有量,item_no列应仅填写物料编号,但存在用户误填型号的情况(如MODEL_B)items:全物料表,包含物料编号(item_no)与对应型号(model_no)
需完成以下操作,要求使用Pandas集合操作(避免循环),对齐SQL查询逻辑:
- 提取
stock中item_no列的型号值 - 在
items的model_no列匹配该型号 - 获取对应型号的最大物料编号(如
MODEL_B对应9H.333) - 用正确的物料编号替换
stock中错误的型号值
示例数据
import pandas as pd from IPython.display import display stock = pd.DataFrame({ 'item_no': ['9H.111', '9H.222', 'MODEL_B', '9H.444', 'MODEL_E', '9H.666'], 'qty': [101, 230, 136, 344, 505, 332], }) items = pd.DataFrame({ 'item_no': ['9H.111', '9H.222', '9H.333', '9H.444', '9H.555', '9H.666', '9H.777', '9H.888'], 'model_no': ['MODEL_A', 'MODEL_B', 'MODEL_B', 'MODEL_C', 'MODEL_D', 'MODEL_E', 'MODEL_D', 'MODEL_F'] }) display(stock) display(items)
解决方案代码
# 1. 预处理items表:按型号分组,获取每个型号对应的最大物料编号 model_item_map = items.groupby('model_no')['item_no'].max().reset_index() # 2. 合并stock与映射表,匹配型号对应的正确物料编号 stock_merged = stock.merge( model_item_map, left_on='item_no', right_on='model_no', how='left' ) # 3. 替换错误的item_no:用匹配到的最大物料编号替换型号,正确编号保留原值 stock_merged['item_no'] = stock_merged['item_no_y'].fillna(stock_merged['item_no_x']) # 4. 清理冗余列,得到最终修正后的库存表 stock_fixed = stock_merged[['item_no', 'qty']] display(stock_fixed)
代码说明
- 预处理映射表:通过
groupby+max生成型号到最大物料编号的映射,对应SQL中的GROUP BY model_no MAX(item_no)逻辑 - 合并匹配:使用
merge操作完成型号与物料编号的关联,对应SQL中的LEFT JOIN逻辑 - 值替换:用
fillna实现“匹配到则替换,未匹配则保留原值”的逻辑,避免循环判断
内容的提问来源于stack exchange,提问作者justasojourner
相关产品推荐
相关产品推荐

