如何编写带每轮动态平均计算的DataFrame库存分配while循环
按ID分组动态分配库存量实现方案
原始数据
ID STOREID BAL SALES SHIP 1 STR1 50 5 18 1 STR2 6 7 18 1 STR3 74 4 18 2 STR1 35 3 500 2 STR2 5 4 500 2 STR3 54 7 500
分配规则
- 按ID分组后,只要该组待分配SHIP值大于0就持续迭代
- 每轮计算组内每行
AVG = BAL / SALES - 给组内AVG最低的行的BAL列和FINAL列各加1
- 迭代直到SHIP值为0,最终每个ID分组的FINAL列总和等于该组原SHIP值
实现代码
import pandas as pd # 构造示例DataFrame data = { "ID": [1,1,1,2,2,2], "STOREID": ["STR1", "STR2", "STR3", "STR1", "STR2", "STR3"], "BAL": [50,6,74,35,5,54], "SALES": [5,7,4,3,4,7], "SHIP": [18,18,18,500,500,500] } df = pd.DataFrame(data) # 初始化结果列 df["FINAL"] = 0 processed_groups = [] # 按ID分组单独处理分配逻辑 for group_id, group in df.groupby("ID"): current_group = group.copy() # 取当前组总待分配量 remain = current_group["SHIP"].iat[0] while remain > 0: # 实时计算当前轮AVG current_group["AVG"] = current_group["BAL"] / current_group["SALES"] # 定位AVG最低的行 min_avg_idx = current_group["AVG"].idxmin() # 更新对应行数值 current_group.loc[min_avg_idx, "BAL"] += 1 current_group.loc[min_avg_idx, "FINAL"] += 1 # 剩余待分配量扣减 remain -= 1 processed_groups.append(current_group) # 合并所有分组得到最终结果 result = pd.concat(processed_groups, ignore_index=True) # AVG保留两位小数输出,可按需调整 result["AVG"] = result["AVG"].round(2) print(result)
首轮输出验证
运行代码第一轮迭代后的结果和需求给出的样例逻辑一致:
ID STOREID BAL SALES SHIP FINAL AVG 0 1 STR1 50 5 18 0 10.00 1 1 STR2 7 7 18 1 1.00 2 1 STR3 74 4 18 0 18.50 3 2 STR1 35 3 500 0 11.67 4 2 STR2 6 4 500 1 1.25 5 2 STR3 54 7 500 0 7.71
内容的提问来源于stack exchange,提问作者its.kcl
相关产品推荐
相关产品推荐

