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

如何从另一DataFrame匹配合适箱号:一对多箱量匹配

机器产量匹配装箱实现方案

数据说明

产量数据(df1)

df1 = pd.DataFrame({'machine':['A','A','A','A','A','B','B','B','B','B','B'],'qty':[1,3,5,2,4,2,4,5,5,3,2]})

箱子容积数据(df2)

df2 = pd.DataFrame({'machine':['A','A','A','A','A','B','B','B','B','B','B','B'],
                    'box_id':['box_1','box_2','box_3','box_4','box_5','box_6','box_7','box_8','box_9','box_10','box_11','box_12'],
                    'volume':[4,5,3,2,5,3,4,3,6,4,8,5]})

需求目标

为df1添加box_id列,匹配df2中符合规则的箱号,最终输出如下output_df:

output_df = pd.DataFrame({'machine':['A','A','A','A','A','B','B','B','B','B','B'],
                           'qty':[1,3,5,2,4,2,4,5,5,3,2],
                           'box_id':['box_1','box_1','box_2','box_3','box_5','box_6','box_7','box_9','box_11','box_12','box_12']})

匹配规则

  • 按df2中对应机器的箱子顺序依次使用
  • 当前箱子剩余空间可容纳当前产量时复用,空间不足则取下一个箱子
  • 机器切换时,重置箱子使用顺序,重新从对应机器的第一个箱子开始匹配

实现代码

import pandas as pd

def assign_boxes(df_production, df_boxes):
    # 按机器分组箱子数据,方便快速调用
    box_groups = {
        machine: group[['box_id', 'volume']].reset_index(drop=True)
        for machine, group in df_boxes.groupby('machine')
    }
    
    assigned_boxes = []
    current_machine = None
    current_box_index = 0
    remaining_space = 0
    
    for _, prod_row in df_production.iterrows():
        machine = prod_row['machine']
        qty = prod_row['qty']
        
        # 切换机器时重置箱子使用状态
        if machine != current_machine:
            current_machine = machine
            current_box_index = 0
            remaining_space = box_groups[machine].iloc[current_box_index]['volume']
        
        # 循环找到能容纳当前产量的箱子
        while remaining_space < qty:
            current_box_index += 1
            remaining_space = box_groups[machine].iloc[current_box_index]['volume']
        
        # 记录分配的箱号,更新剩余空间
        box_id = box_groups[machine].iloc[current_box_index]['box_id']
        remaining_space -= qty
        
        assigned_boxes.append({
            'machine': machine,
            'qty': qty,
            'box_id': box_id
        })
    
    return pd.DataFrame(assigned_boxes)

# 执行示例
df1 = pd.DataFrame({'machine':['A','A','A','A','A','B','B','B','B','B','B'],'qty':[1,3,5,2,4,2,4,5,5,3,2]})
df2 = pd.DataFrame({'machine':['A','A','A','A','A','B','B','B','B','B','B','B'],
                    'box_id':['box_1','box_2','box_3','box_4','box_5','box_6','box_7','box_8','box_9','box_10','box_11','box_12'],
                    'volume':[4,5,3,2,5,3,4,3,6,4,8,5]})

output_df = assign_boxes(df1, df2)
print(output_df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:17:44