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

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

实现方案

核心逻辑

  1. 先对DataFrame按value1、value2降序排序,确保高分对应排序靠前的行
  2. 计算每个分数需要分配的行数:总数据量除以分数数量得到基础行数,余数部分优先分配给高分,保证分配均匀
  3. 生成对应长度的分数列表,合并到排序后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:46:02