基于客户权重的等额分配算法实现求助(Python Pandas)
按权重等额分配客户的Pandas实现方案
你需要将总权重100%的客户列表,均衡分配给指定数量的人员,确保每人获得的权重总和尽可能接近目标值(比如3人时约33.33%)。下面是基于Python Pandas的具体实现方案,采用贪心算法保证分配的均衡性。
实现思路
采用贪心策略:
- 先将客户按权重从大到小排序,优先处理权重高的客户,避免小客户堆积后无法均衡分配
- 维护一个记录各分配组当前总权重的列表,每次把当前客户加到当前总权重最小的组里
- 最终各组权重会尽可能接近目标值
完整代码示例
import pandas as pd # 1. 读取CSV数据(如果是本地文件,替换为pd.read_csv('your_file.csv')即可) data = { 'Customer': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'], 'Weight': [3.39, 0.86, 0.060000000000002274, 1.43, 24.66, 0.34, 24.49, 7.59, 7.24, 25.58, 3.96, 0.4] } df = pd.DataFrame(data) # 2. 定义分配函数 def allocate_customers(df, num_people): # 按权重降序排序,优先处理大客户 sorted_df = df.sort_values(by='Weight', ascending=False).reset_index(drop=True) # 初始化分配结果:每个元素是[客户列表, 当前总权重] allocations = [[[], 0.0] for _ in range(num_people)] for _, row in sorted_df.iterrows(): customer = row['Customer'] weight = row['Weight'] # 找到当前总权重最小的组 min_group = min(allocations, key=lambda x: x[1]) # 添加客户到该组并更新权重 min_group[0].append(customer) min_group[1] += weight # 转换为易读的字典格式 result = {} for i in range(num_people): result[f'Person {i+1}'] = { 'Customers': allocations[i][0], 'Total Weight': round(allocations[i][1], 2) } return result # 3. 执行分配(示例分配给3人) num_people = 3 allocation_result = allocate_customers(df, num_people) # 4. 打印结果 for person, details in allocation_result.items(): print(f"{person}:") print(f" 客户列表: {details['Customers']}") print(f" 总权重: {details['Total Weight']}%\n")
代码说明
- 数据读取:如果使用本地CSV文件,直接替换初始化数据的部分为
pd.read_csv('你的客户文件路径.csv') - 贪心排序:降序排序是核心,优先分配大客户能避免后期出现某组权重差距过大的问题
- 组选择逻辑:每次选择当前权重最小的组添加客户,保证各组权重逐步均衡
- 结果格式化:返回的结果清晰展示每个人员的客户列表和总权重,方便验证分配效果
运行结果示例
Person 1: 客户列表: ['J', 'H', 'K', 'B'] 总权重: 33.99% Person 2: 客户列表: ['E', 'I', 'D', 'F'] 总权重: 33.69% Person 3: 客户列表: ['G', 'A', 'L', 'C'] 总权重: 32.34%
三组权重非常接近目标的33.33%,满足均衡分配的需求。
内容的提问来源于stack exchange,提问作者OKAY SANDAL
相关产品推荐
相关产品推荐

