You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过另一DataFrame查询值更新Pandas中某DataFrame的单元格

Pandas实现库存物料编号修正(替代PostgreSQL逻辑)

需求背景

此前在PostgreSQL中实现过库存物料编号修正功能,现改用Pandas完成全流程处理(后续将对接PostgreSQL物料表)。现有两个DataFrame:

  • stock:记录库存现有量,item_no列应仅填写物料编号,但存在用户误填型号的情况(如MODEL_B)
  • items:全物料表,包含物料编号(item_no)与对应型号(model_no)

需完成以下操作,要求使用Pandas集合操作(避免循环),对齐SQL查询逻辑:

  1. 提取stock中item_no列的型号值
  2. 在items的model_no列匹配该型号
  3. 获取对应型号的最大物料编号(如MODEL_B对应9H.333)
  4. 用正确的物料编号替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:50:27