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

如何在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)
修正方案

核心思路

  1. 先构建产品配对的双向映射字典,方便快速查找任意产品的配对ID
  2. 用集合记录已分配的产品,避免重复处理
  3. 处理单个产品时,先计算其与配对产品的总箱数,判断是否能放入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:25:20