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

Pandas如何按队伍分组取最高分并实现跨组无并列排名

需求说明

需要实现的数据处理逻辑如下:

  • 先计算每个TEAM对应的SCORE最大值
  • 再按规则完成队伍升序排名,规则要求:
    • 不同队伍不能持有相同排名
    • 若不同队伍最高得分一致,原数据中先出现的队伍排名更靠前,其余队伍排名依次顺延
    • 同一队伍下所有记录的排名值完全一致
  • 测试输入数据结构:
TEAM   |  GROUP  |   SCORE  
1      |    A    |    5
1      |    B    |    5
1      |    C    |    5
2      |    D    |    6
2      |    A    |    6
3      |    D    |    5
3      |    A    |    5
  • 期望输出(新增RANK列):
TEAM   |  GROUP  |   SCORE   |  RANK
1      |    A    |    5      |   1
1      |    B    |    5      |   1
1      |    C    |    5      |   1
2      |    D    |    6      |   3
2      |    A    |    6      |   3
3      |    D    |    5      |   2
3      |    A    |    5      |   2
原有代码问题

初始代码存在两个核心错误,无法得到正确结果:

team = df.groupby(['TEAM'])

for x in team:
    df['Rank'] = x.groupby(['TEAM'])['SCORE'].max().rank()
  • 遍历分组时反复对整个DataFrame的Rank列赋值,最终只会保留最后一次循环的计算结果
  • 没有保留队伍在原表中的出现顺序,也没有将分组计算的排名映射回原表的全量记录,且rank参数不符合规则要求
正确实现代码
import pandas as pd

# 1. 按TEAM分组,关闭分组默认排序,保留队伍在原表中的首次出现顺序,计算每个队伍的最高得分
team_max = df.groupby('TEAM', sort=False)['SCORE'].max()

# 2. 对队伍做排名:按最高得分升序排列,同分按原出现顺序排位,不生成并列名次,结果转整数
team_rank = team_max.rank(method='first', ascending=True).astype(int)

# 3. 把队伍对应的排名映射回原表每一行,同队伍自动填充相同排名
df['RANK'] = df['TEAM'].map(team_rank)

运行上述代码后得到的结果和期望输出完全一致,关键参数说明:

  • sort=False:分组时不按TEAM值排序,保留TEAM在原数据中第一次出现的先后顺序
  • method='first':值相同时按序列本身的顺序分配排名,不产生并列名次,符合同分先出现排前面的要求
  • ascending=True:按SCORE值升序排名,值越小排名越靠前

内容的提问来源于stack exchange,提问作者its.kcl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:18:28