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

从另一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")

展示效果:

boxIDvolume
A30
B25
C30
D10

产品信息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 Noamount
110
25
313
415
520
610
717

示例输出

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 Noamountbox ID
110A
25A
313A
415B
520C
610C
717D

解决方案代码

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'))

代码说明

  1. 初始化变量:

    • current_box_idx:记录当前正在使用的箱的索引,从第一个箱(索引0)开始
    • remaining_volume:当前箱剩余的可容纳容量,初始为第一个箱的总容量
    • box_ids:用来存储每个产品对应的箱ID,最后会转成df2的新列
  2. 遍历产品数量:

    • 对每个产品的数量,先检查能不能放进当前箱的剩余容量
    • 如果装不下,就切换到下一个箱,更新剩余容量(直到找到能装下的箱)
    • 给当前产品分配箱ID,然后减去产品数量,更新剩余容量
  3. 添加新列:把存储好的箱ID列表添加到df2中,得到最终结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:01:27