从另一DataFrame匹配唯一分组:为产品分配对应容量的箱ID
Python实现按箱容量顺序分配产品到对应箱ID的方案
我是Python初学者,需要完成以下任务:现有两个DataFrame:
- df1:箱信息,包含
boxID(箱编号)和volume(箱容量) - df2:产品信息,包含
Product No(产品编号)和amount(产品数量)
需要给df2新增box ID列,规则是按顺序累加df2的产品数量,尽可能填满但不超过对应箱的容量,匹配对应的箱ID。比如箱A容量30,累加产品1(10)、2(5)、3(13)总和28未超30,再加产品4就会超,所以这三个产品分配给A;接下来产品4分配给箱B,以此类推。
示例输入
箱信息df1
import pandas as pd df1 = pd.DataFrame({'boxID':['A', 'B', 'C', 'D'],'volume':[30,25,30,10]}) # 设置boxID为索引后的展示 df1.set_index("boxID")
展示效果:
| boxID | volume |
|---|---|
| A | 30 |
| B | 25 |
| C | 30 |
| D | 10 |
产品信息df2
df2 = pd.DataFrame({'Product No':['1', '2', '3', '4', '5', '6', '7'],'amount':[10, 5, 13, 15, 20, 10, 17]}) # 设置Product No为索引后的展示 df2.set_index("Product No")
展示效果:
| Product No | amount |
|---|---|
| 1 | 10 |
| 2 | 5 |
| 3 | 13 |
| 4 | 15 |
| 5 | 20 |
| 6 | 10 |
| 7 | 17 |
示例输出
output_df2 = pd.DataFrame({'Product No':['1', '2', '3', '4', '5', '6', '7'],'amount':[10, 5, 13, 15, 20, 10, 17], 'box ID':['A', 'A', 'A', 'B', 'C', 'C', 'D']}) # 设置Product No为索引后的展示 output_df2.set_index("Product No")
展示效果:
| Product No | amount | box ID |
|---|---|---|
| 1 | 10 | A |
| 2 | 5 | A |
| 3 | 13 | A |
| 4 | 15 | B |
| 5 | 20 | C |
| 6 | 10 | C |
| 7 | 17 | D |
解决方案代码
import pandas as pd # 初始化输入数据 df1 = pd.DataFrame({'boxID':['A', 'B', 'C', 'D'],'volume':[30,25,30,10]}) df2 = pd.DataFrame({'Product No':['1', '2', '3', '4', '5', '6', '7'],'amount':[10, 5, 13, 15, 20, 10, 17]}) # 初始化变量:当前箱索引、当前箱剩余容量、存储箱ID的列表 current_box_idx = 0 remaining_volume = df1.loc[current_box_idx, 'volume'] box_ids = [] # 遍历每个产品的数量 for amount in df2['amount']: # 如果当前产品装不进剩余容量,切换到下一个箱 while amount > remaining_volume: current_box_idx += 1 remaining_volume = df1.loc[current_box_idx, 'volume'] # 分配当前箱ID box_ids.append(df1.loc[current_box_idx, 'boxID']) # 更新剩余容量 remaining_volume -= amount # 将箱ID列添加到df2中 df2['box ID'] = box_ids # 打印最终结果 print(df2.set_index('Product No'))
代码说明
初始化变量:
current_box_idx:记录当前正在使用的箱的索引,从第一个箱(索引0)开始remaining_volume:当前箱剩余的可容纳容量,初始为第一个箱的总容量box_ids:用来存储每个产品对应的箱ID,最后会转成df2的新列
遍历产品数量:
- 对每个产品的数量,先检查能不能放进当前箱的剩余容量
- 如果装不下,就切换到下一个箱,更新剩余容量(直到找到能装下的箱)
- 给当前产品分配箱ID,然后减去产品数量,更新剩余容量
添加新列:把存储好的箱ID列表添加到df2中,得到最终结果
内容的提问来源于stack exchange,提问作者ghost_like
相关产品推荐
相关产品推荐

