如何在Python循环中处理关联产品的同仓分配逻辑
问题说明
- 已实现逻辑:将高损失产品(未存入warehouse1的)分配至warehouse1
- 额外需求:部分产品属于配对产品,必须存入同一仓库;现有一个包含两列的DataFrame,列名分别为
productid和productid2 - 需修改现有循环代码,找到对应配对的产品ID,对其执行相同的仓库分配操作
当前代码
warehouse = [] capacity = 960.0 capacitysum = 0 for index, row in dfAvgDailyProfitLoss_PickUpBoxes.iterrows(): capacityleft = capacity - capacitysum if capacityleft >= row["#pickUpBoxes"]: warehouse.append("warehouse1") capacitysum = capacitysum + (row["#pickUpBoxes"]) # 此处配对处理逻辑存在问题,需修正 for row["product-id"], line in zip(x, y): if capacityleft >= row["#pickUpBoxes"]: warehouse.append("warehouse1") capacitysum = capacitysum + (row["#pickUpBoxes"]) else: warehouse.append("warehouse2") dfAvgDailyProfitLoss_PickUpBoxes["warehouse"] = warehouse print(dfAvgDailyProfitLoss_PickUpBoxes)
修正方案
核心思路
- 先构建产品配对的双向映射字典,方便快速查找任意产品的配对ID
- 用集合记录已分配的产品,避免重复处理
- 处理单个产品时,先计算其与配对产品的总箱数,判断是否能放入warehouse1,再统一分配仓库
修正后代码
# 假设配对DataFrame名为df_pairs,列名是productid和productid2 pair_map = {} for _, pair_row in df_pairs.iterrows(): # 建立双向映射,正反都能查找到配对产品 pair_map[pair_row["productid"]] = pair_row["productid2"] pair_map[pair_row["productid2"]] = pair_row["productid"] warehouse = [] capacity = 960.0 capacitysum = 0 assigned_products = set() # 记录已完成分配的产品,防止重复处理 for index, row in dfAvgDailyProfitLoss_PickUpBoxes.iterrows(): product_id = row["product-id"] # 若产品已分配过,直接复用已有仓库值 if product_id in assigned_products: warehouse.append(dfAvgDailyProfitLoss_PickUpBoxes.loc[ dfAvgDailyProfitLoss_PickUpBoxes["product-id"] == product_id, "warehouse" ].values[0]) continue # 获取配对产品ID(无配对则为None) paired_product_id = pair_map.get(product_id) # 计算当前产品+配对产品的总箱数 total_boxes = row["#pickUpBoxes"] if paired_product_id: paired_row = dfAvgDailyProfitLoss_PickUpBoxes[ dfAvgDailyProfitLoss_PickUpBoxes["product-id"] == paired_product_id ].iloc[0] total_boxes += paired_row["#pickUpBoxes"] capacityleft = capacity - capacitysum if capacityleft >= total_boxes: # 分配至warehouse1 warehouse.append("warehouse1") capacitysum += total_boxes # 标记当前产品和配对产品为已分配 assigned_products.add(product_id) if paired_product_id: assigned_products.add(paired_product_id) # 提前给配对产品设置仓库值,后续遍历到直接复用 dfAvgDailyProfitLoss_PickUpBoxes.loc[ dfAvgDailyProfitLoss_PickUpBoxes["product-id"] == paired_product_id, "warehouse" ] = "warehouse1" else: # 分配至warehouse2 warehouse.append("warehouse2") assigned_products.add(product_id) if paired_product_id: assigned_products.add(paired_product_id) dfAvgDailyProfitLoss_PickUpBoxes.loc[ dfAvgDailyProfitLoss_PickUpBoxes["product-id"] == paired_product_id, "warehouse" ] = "warehouse2" dfAvgDailyProfitLoss_PickUpBoxes["warehouse"] = warehouse print(dfAvgDailyProfitLoss_PickUpBoxes)
关键细节
- 双向映射确保不管遍历到配对中的哪一个产品,都能快速找到另一个
- 先计算总箱数再判断容量,避免出现配对产品被拆分到不同仓库的情况
- 已分配集合避免重复处理同一产品,提升效率同时防止逻辑冲突
内容的提问来源于stack exchange,提问作者Esmee
相关产品推荐
相关产品推荐

