如何在Pandas中为每个数值列生成rank?能否通过循环列实现?
Pandas实现按列计算分数排名(遍历列方式)
示例数据
首先定义示例DataFrame:
import pandas as pd df = pd.DataFrame([['Jim', 93, 87, 66], ['Bob', 88, 90, 65], ['Joe', 72, 100, 70]], columns=['Name', 'Score1', 'Score2', 'Score3'])
原始数据输出:
Name Score1 Score2 Score3 Jim 93 87 66 Bob 88 90 65 Joe 72 100 70
需求说明
需要生成新表,展示每列分数的排名(分数越高排名越靠前),期望输出:
Name Score1 Score2 Score3 Jim 1 3 2 Bob 2 2 3 Joe 3 1 1
遍历列的实现方法
完全可以通过遍历每一列的方式实现,具体步骤如下:
- 复制原始DataFrame的
Name列作为结果表的基础 - 遍历所有分数列(排除
Name列),对每一列计算排名 - 将计算得到的排名替换结果表中对应的列
代码实现:
# 复制Name列到结果表 rank_df = df[['Name']].copy() # 遍历所有分数列 for col in df.columns[1:]: # 使用rank方法,ascending=False设置分数越高排名越前,method='min'保证相同分数取最小排名 rank_df[col] = df[col].rank(ascending=False, method='min').astype(int) print(rank_df)
运行后即可得到期望的排名结果。
更高效的向量化实现(推荐)
如果你的DataFrame包含大量列和行,向量化操作比遍历更高效,无需循环直接对所有分数列批量计算排名:
# 对除Name外的列批量计算排名 rank_df = df.copy() rank_df[df.columns[1:]] = df[df.columns[1:]].rank(ascending=False, method='min').astype(int) print(rank_df)
这种方法代码更简洁,性能也更优,适合处理大规模数据。
内容的提问来源于stack exchange,提问作者code_machine
相关产品推荐
相关产品推荐

