如何按配额限制循环分配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
相关产品推荐
相关产品推荐

