使用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
相关产品推荐
相关产品推荐

