按日级分配箱容量:基于DataFrame优先级与日容量的实现问题
解决方案
需求分析
按Preference优先级(数值越小优先级越高),将每个Box的box_cap分配到每日的Capacity中,每日容量耗尽后自动转到下一天,直到所有Box的容量全部分配完成。
数据初始化
先定义示例DataFrame:
import pandas as pd df_box = pd.DataFrame({ 'Box': [1, 2, 3], 'box_cap': [16, 16, 15], 'size': [1200, 1550, 1300], 'Preference': [1, 2, 3] }) df_day = pd.DataFrame({ 'Day': [1, 2], 'Capacity': [23, 24] })
实现代码
# 按优先级排序,确保高优先级箱先分配 df_box_sorted = df_box.sort_values('Preference').reset_index(drop=True) # 跟踪每日剩余可分配容量 day_remaining = df_day.set_index('Day')['Capacity'].copy() # 存储分配结果 result = [] # 遍历每个箱 for _, box_row in df_box_sorted.iterrows(): box_id = box_row['Box'] left_box_cap = box_row['box_cap'] # 遍历还有剩余容量的天数 for day in day_remaining[day_remaining > 0].index: if left_box_cap <= 0: break # 计算本次分配量:取当日剩余容量与箱剩余容量的最小值 allocate = min(day_remaining[day], left_box_cap) # 记录分配记录 result.append({ 'Day': day, 'Box': box_id, 'box_cap': allocate }) # 更新剩余容量 day_remaining[day] -= allocate left_box_cap -= allocate # 转为结果DataFrame df_result = pd.DataFrame(result) print(df_result)
代码说明
- 排序处理:先对箱按
Preference升序排序,保证优先级高的箱优先分配,符合需求逻辑。 - 剩余容量跟踪:用
day_remaining变量单独跟踪每日剩余可分配容量,避免修改原始数据。 - 分配逻辑:对每个箱,遍历仍有剩余容量的天数,每次分配尽可能多的容量(要么耗尽当日容量,要么耗尽箱的剩余容量),同时更新双方的剩余值,直到箱的容量全部分配完成。
- 结果收集:将每次分配的记录存入列表,最后转为DataFrame得到目标输出。
输出验证
运行代码后得到的结果与需求完全一致:
Day Box box_cap 0 1 1 16 1 1 2 7 2 2 2 9 3 2 3 15
内容的提问来源于stack exchange,提问作者Manglu
相关产品推荐
相关产品推荐

