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

使用Python(Pandas&NumPy)比对两个DataFrame寻找物料最优补库工厂

实现思路
  • 第一步:将宽格式的负库存表和库存表转为长格式,把物料号从列名转为单独的字段,更便于后续批量计算
  • 第二步:处理负库存表,过滤出库存<0的缺料记录,将负数转为正的缺料数量
  • 第三步:处理库存表,按物料分组找到每个物料库存最高的工厂,也可以根据业务需求调整为「排除缺料工厂本身后找库存最高的工厂」
  • 第四步:将缺料记录和最优补库工厂数据关联,得到最终的补库匹配结果
实现代码
import pandas as pd

# 你已有的读取Excel代码
alert = pd.read_excel(r'C:\Users\OneDrive - CCEP\Desktop\Python database\alert.xlsx' , sheet_name='Sheet1')
stock = pd.read_excel(r'C:\Users\OneDrive - CCEP\Desktop\Python database\stock.xlsx', sheet_name='Sheet1')

# ------------------- 1. 宽表转长表 -------------------
# 负库存表转长表,过滤缺料记录
short_long = alert.melt(id_vars='Plant', var_name='物料号', value_name='库存数')
short_shortage = short_long[short_long['库存数'] < 0].copy()
short_shortage['缺料量'] = -short_shortage['库存数']
short_shortage = short_shortage[['Plant', '物料号', '缺料量']].rename(columns={'Plant':'缺料工厂'})

# 库存表转长表
stock_long = stock.melt(id_vars='Plant', var_name='物料号', value_name='可调配库存')

# ------------------- 2. 找到每个物料的最优补库工厂 -------------------
# 按物料分组,取库存最高的工厂,如果有多个库存相同的取第一个
best_supplier = stock_long.sort_values('可调配库存', ascending=False).groupby('物料号', as_index=False).first()
best_supplier = best_supplier.rename(columns={'Plant':'补库工厂', '可调配库存':'补库工厂库存'})

# ------------------- 3. 关联得到最终匹配结果 -------------------
result = pd.merge(short_shortage, best_supplier, on='物料号', how='left')

# 输出结果
print(result)
# 如需导出到Excel可使用以下代码
# result.to_excel('补库匹配结果.xlsx', index=False)

如果你实际的业务逻辑是「不管缺什么物料,统一给缺料工厂匹配所有物料里库存最高的工厂」,可以把找最优补库工厂的代码替换为:

# 找到全局库存最高的工厂
best_supplier = stock_long.sort_values('可调配库存', ascending=False).iloc[[0]][['Plant', '物料号', '可调配库存']]
best_supplier = best_supplier.rename(columns={'Plant':'补库工厂', '可调配库存':'补库工厂库存'})
# 直接关联所有缺料记录即可
result = short_shortage.assign(temp=1).merge(best_supplier.assign(temp=1), on='temp').drop('temp', axis=1)

内容的提问来源于stack exchange,提问作者maki raki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:36:08