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
相关产品推荐
相关产品推荐

