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

如何编写带每轮动态平均计算的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:15:04