如何按限额均衡轮询将销售人员分配至门店DataFrame?
销售人员均衡轮询分配实现方案
核心思路
按照需求的「先对齐限额再轮询」逻辑,步骤如下:
- 先将销售人员按分配限额从高到低排序,便于逐步对齐配额
- 每次优先让当前配额最高的销售人员,分配至与当前次高配额平齐的数量,再联合已对齐的人员一起轮询,逐步纳入下一个配额更低的人员
- 当某销售人员配额耗尽时,自动退出轮询,剩余人员继续按规则分配,直到所有门店分配完成或所有配额用完
代码实现
1. 模拟测试数据
import pandas as pd # 销售人员及配额表 df_A = pd.DataFrame({ 'Salesperson': ['Dd', 'Ee', 'Aa', 'Bb', 'Cc'], 'Quota': [15, 12, 10, 8, 5] }) # 100家待分配门店 df_B = pd.DataFrame({'Store': range(1, 101)})
2. 分配逻辑实现
# 按配额降序排序,重置索引方便操作 df_sorted = df_A.sort_values('Quota', ascending=False).reset_index(drop=True) remaining_quota = df_sorted['Quota'].tolist() remaining_stores = len(df_B) assigned_list = [] while remaining_stores > 0 and sum(remaining_quota) > 0: # 筛选当前还有配额的销售人员索引 active_indices = [i for i, q in enumerate(remaining_quota) if q > 0] if not active_indices: break # 获取当前活跃销售中的最低配额值 min_active_q = min([remaining_quota[i] for i in active_indices]) # 计算本轮可分配的批次大小:取对齐到最低配额的次数,或剩余门店能支撑的整轮数 batch = min(min_active_q, remaining_stores // len(active_indices)) if batch == 0: # 剩余门店不足以完成一轮全部分配,按顺序逐个分配直到门店耗尽 for idx in active_indices: if remaining_stores <= 0: break assign_num = min(remaining_quota[idx], remaining_stores) assigned_list.extend([df_sorted.loc[idx, 'Salesperson']] * assign_num) remaining_stores -= assign_num remaining_quota[idx] = 0 break # 执行本轮批次分配 for idx in active_indices: assigned_list.extend([df_sorted.loc[idx, 'Salesperson']] * batch) remaining_quota[idx] -= batch remaining_stores -= batch # 将分配结果赋值给df_B的Assigned列 df_B['Assigned'] = assigned_list[:len(df_B)]
逻辑说明
- 初始排序后,先处理配额最高的
Dd,先分配3次(15-12=3),让Dd的剩余配额和Ee平齐为12 - 接着
Dd和Ee一起轮询,每次各分配1次,直到剩余配额降到和下一个Aa的10平齐(需要轮询2次) - 之后
Dd、Ee、Aa一起轮询,直到配额降到Bb的8,以此类推 - 当某销售人员配额耗尽后,自动从轮询列表中剔除,剩余人员继续按规则分配,直到所有门店分配完成
内容的提问来源于stack exchange,提问作者Bruce Wayne 0005
相关产品推荐
相关产品推荐

