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

如何按配额限制循环分配DataFrame中的销售代表至另一DataFrame?

带配额限制的循环轮询分配销售代表解决方案

问题说明

现有两个DataFrame:

  • Dataframe_1:包含Salesguy(销售代表)和limit(分配配额)字段
  • Dataframe_2:含10列门店数据,共1000行
    需求为给Dataframe_2新增一列,按循环轮询方式分配销售代表,但需遵循配额限制:代表配额耗尽后立即停止参与后续分配。例如C配额为0时,初始分配序列为ABDE循环;E配额耗尽后,序列自动变为ABD循环。

现有代码仅能实现无配额限制的循环分配,无法处理配额耗尽的逻辑。

解决方案代码

import pandas as pd

# ----------------------
# 替换为你的实际DataFrame数据
# ----------------------
# 示例Dataframe_1:销售代表与对应配额
df1 = pd.DataFrame({
    'Salesguy': ['A', 'B', 'C', 'D', 'E'],
    'limit': [5, 5, 0, 5, 6]
})
# 示例Dataframe_2:1000行门店数据
df2 = pd.DataFrame(pd.np.random.randn(1000, 10))

# 1. 预处理:过滤掉配额为0的销售代表,生成初始可用列表
available_sales = df1[df1['limit'] > 0].reset_index(drop=True)

# 2. 生成符合配额规则的分配序列
assign_sequence = []
current_idx = 0

while len(assign_sequence) < len(df2):
    # 若当前代表还有配额,执行分配并扣减配额
    if available_sales.loc[current_idx, 'limit'] > 0:
        assign_sequence.append(available_sales.loc[current_idx, 'Salesguy'])
        available_sales.loc[current_idx, 'limit'] -= 1
    
    # 轮询到下一个代表
    current_idx = (current_idx + 1) % len(available_sales)
    
    # 移除已耗尽配额的代表,更新可用列表
    available_sales = available_sales[available_sales['limit'] > 0].reset_index(drop=True)
    
    # 若所有代表配额都耗尽,提前终止(可根据需求补充默认值)
    if len(available_sales) == 0:
        break

# 3. 将分配序列写入Dataframe_2的新列
df2['Sales_Assignment'] = assign_sequence[:len(df2)]

代码逻辑说明

  • 预处理阶段:直接过滤掉配额为0的代表,避免无效分配
  • 轮询分配阶段:
    • 按索引循环遍历可用代表,每次分配后扣减对应配额
    • 代表配额耗尽时,自动从可用列表中移除,后续轮询不再包含该代表
    • 处理了总配额小于Dataframe_2行数的边界情况(若配额耗尽,剩余行可按需补充默认值)
  • 赋值阶段:将生成的序列直接映射到Dataframe_2的新增列中

内容的提问来源于stack exchange,提问作者Bruce Wayne 0005

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:25:21