如何从另一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
相关产品推荐
相关产品推荐

