Python(Pandas)中基于多列排序的分数动态均匀分配
Pandas动态均匀分配分数实现方案
需求说明
现有如下Pandas DataFrame:
ID value1 value2 1 90 1000 2 89 999 3 89 998 4 85 1000 5 84 850
另有分数列表:
score = [6,7,8,9,10]
需完成以下操作:
- 按
value1降序、value2降序对DataFrame排序 - 将排序后的行动态均匀分配到
score列表的分数中,排序越靠前的行对应越高的分数,分配规则参考以下三组示例
示例1
输入:
ID value1 value2 1 90 1000 2 89 999 3 89 998 4 85 1000 5 84 850
输出:
ID value1 value2 score 1 90 1000 10 2 89 999 9 3 89 998 8 4 85 1000 7 5 84 850 6
示例2
输入:
ID value1 value2 1 90 1000 2 89 999 3 89 998 4 85 1000 5 84 850 6 83 998 7 82 1000 8 81 850
输出:
ID value1 value2 score 1 90 1000 10 2 89 999 10 3 89 998 9 4 85 1000 9 5 84 850 8 6 83 998 8 7 82 1000 7 8 81 850 6
示例3
输入:
ID value1 value2 1 90 1000 2 89 999 3 89 998 4 85 1000 5 84 850 6 83 998 7 82 1000 8 81 850 9 80 998 10 79 1000 11 78 850
输出:
ID value1 value2 score 1 90 1000 10 2 89 999 10 3 89 998 10 4 85 1000 9 5 84 850 9 6 83 998 8 7 82 1000 8 8 81 850 7 9 80 998 7 10 79 1000 6 11 78 850 6
实现方案
核心逻辑
- 先对DataFrame按
value1、value2降序排序,确保高分对应排序靠前的行 - 计算每个分数需要分配的行数:总数据量除以分数数量得到基础行数,余数部分优先分配给高分,保证分配均匀
- 生成对应长度的分数列表,合并到排序后的DataFrame中
代码实现
import pandas as pd def assign_scores(df, score_list): # 按value1、value2降序排序 sorted_df = df.sort_values(by=['value1', 'value2'], ascending=False).reset_index(drop=True) total_rows = len(sorted_df) num_scores = len(score_list) base_count = total_rows // num_scores remainder = total_rows % num_scores # 计算每个分数对应的行数:前remainder个高分多分配1行 score_counts = [] for i in range(num_scores): score_counts.append(base_count + 1 if i < remainder else base_count) # 按分数从高到低生成分配列表 sorted_scores = sorted(score_list, reverse=True) assigned_scores = [] for score, count in zip(sorted_scores, score_counts): assigned_scores.extend([score] * count) # 合并分数列 sorted_df['score'] = assigned_scores return sorted_df # 测试示例1 df1 = pd.DataFrame({ 'ID': [1,2,3,4,5], 'value1': [90,89,89,85,84], 'value2': [1000,999,998,1000,850] }) score = [6,7,8,9,10] print("示例1输出:") print(assign_scores(df1, score)) # 测试示例2 df2 = pd.DataFrame({ 'ID': [1,2,3,4,5,6,7,8], 'value1': [90,89,89,85,84,83,82,81], 'value2': [1000,999,998,1000,850,998,1000,850] }) print("\n示例2输出:") print(assign_scores(df2, score)) # 测试示例3 df3 = pd.DataFrame({ 'ID': [1,2,3,4,5,6,7,8,9,10,11], 'value1': [90,89,89,85,84,83,82,81,80,79,78], 'value2': [1000,999,998,1000,850,998,1000,850,998,1000,850] }) print("\n示例3输出:") print(assign_scores(df3, score))
代码说明
- 排序:使用
sort_values完成指定列的降序排序,reset_index重置索引保证后续分配对齐 - 行数计算:通过整除和取余确定基础行数和余数,余数优先分配给高分,确保分配均匀
- 分数生成:将分数列表降序排列后,按计算出的行数生成对应长度的分数列表,最后合并到DataFrame中
内容的提问来源于stack exchange,提问作者ijaz ahamed
相关产品推荐
相关产品推荐

