Pandas 中文手册

13.2 数据排名(进阶,给数据分配排名)

Pandas数据排名教程:rank方法详解与实践应用

Pandas 中文手册

本章节详细讲解Pandas中的rank方法,包括基础排名、method参数配置(如average、min等)、ascending参数控制排名方向、axis参数设置行或列排名,并提供学生成绩和商品销量的实战应用示例,适合新手学习。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Pandas数据排名(进阶)

引言

在数据分析和处理中,数据排名是一种常见需求,比如为学生成绩或商品销量分配名次。Pandas库提供了rank方法,能够高效地为数据分配排名,支持多种排名方式和配置。本教程将一步步引导你掌握Pandas中的排名技巧,从基础到进阶,确保简单易懂。

基础排名:使用rank方法

Pandas中的rank方法是给Series或DataFrame中的值分配排名的基础函数。基本语法如下:

import pandas as pd

# 创建一个示例Series
scores = pd.Series([80, 90, 70, 100, 85])

# 使用rank方法进行默认排名(升序、平均排名)
ranked = scores.rank()
print(ranked)

输出:

0    3.0
1    4.0
2    1.0
3    5.0
4    2.0
dtype: float64

解释:在这个例子中,rank()默认使用升序排名(ascending=True)和平均排名方式(method='average')。值70排名第1,85排名第2,80排名第3,90排名第4,100排名第5。排名从1开始。

排名方式配置:method参数详解

method参数允许你控制当出现相同值时如何分配排名。它有多种选项:

  • average(默认):为相同值分配平均排名。例如,如果两个值都排名第2和第3,它们会得到2.5的平均排名。
  • min:为相同值分配最小可能排名。例如,如果排名第2和第3,它们都得到排名2。
  • max:为相同值分配最大可能排名。例如,如果排名第2和第3,它们都得到排名3。
  • first:为相同值按它们在数据中出现的顺序分配排名,第一个出现的排名较低。
  • dense:类似min,但排名之间没有间隔(即,如果有并列第1,下一个排名是第2,而不是第3)。

代码示例:

# 创建一个有重复值的Series
data = pd.Series([10, 20, 20, 30, 40])

# 使用不同method参数
print("average:", data.rank(method='average'))
print("min:", data.rank(method='min'))
print("max:", data.rank(method='max'))
print("first:", data.rank(method='first'))
print("dense:", data.rank(method='dense'))

输出:

average: 1.0  3.5  3.5  5.0  6.0
min:     1.0  3.0  3.0  5.0  6.0
max:     1.0  4.0  4.0  5.0  6.0
first:   1.0  2.0  3.0  5.0  6.0
dense:   1.0  2.0  2.0  3.0  4.0

解释:在这个例子中,两个20值是相同的。使用不同method参数时,排名分配有所不同,帮助理解每种方式的特点。

排名方向:ascending参数控制

ascending参数控制排名是升序(从小到大)还是降序(从大到小)。默认值为True(升序)。

  • ascending=True:值越小排名越高(例如,最小值为排名第1)。
  • ascending=False:值越大排名越高(例如,最大值为排名第1)。

代码示例:

# 升序排名
print("升序排名:", scores.rank(ascending=True))
# 降序排名
print("降序排名:", scores.rank(ascending=False))

输出:

升序排名: 3.0  4.0  1.0  5.0  2.0
降序排名: 3.0  2.0  5.0  1.0  4.0

解释:升序排名时,70最小,排名第1;降序排名时,100最大,排名第1。

按行/列排名:axis参数设置

对于DataFrame,axis参数控制排名是按行(axis=1)还是按列(axis=0)进行。默认是axis=0(按列)。

  • axis=0:对每列的数据单独排名。
  • axis=1:对每行的数据单独排名。

代码示例:

# 创建一个DataFrame
df = pd.DataFrame({'A': [100, 90, 80], 'B': [70, 85, 95]})

# 按列排名(默认)
print("按列排名:")
print(df.rank())

# 按行排名
print("\n按行排名:")
print(df.rank(axis=1))

输出:

按列排名:
   A    B
0  3.0  1.0
1  2.0  2.0
2  1.0  3.0

按行排名:
   A    B
0  2.0  1.0
1  2.0  1.0
2  1.0  2.0

解释:按列排名时,每列内部的值单独排名;按行排名时,每行内部的值单独排名。这在处理多维数据时很有用。

实战应用

1. 学生成绩排名

假设有一个学生成绩表,需要计算每个学生的总分排名。

# 创建学生成绩DataFrame
students = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '数学': [85, 90, 78, 92],
    '英语': [88, 85, 90, 87],
    '总分': [173, 175, 168, 179]
})

# 按总分降序排名(从高到低)
students['排名'] = students['总分'].rank(ascending=False, method='min')
print(students.sort_values(by='排名'))

输出:

   姓名  数学  英语  总分   排名
3  赵六  92  87  179  1.0
1  李四  90  85  175  2.0
0  张三  85  88  173  3.0
2  王五  78  90  168  4.0

解释:使用ascending=False进行降序排名,method='min'确保相同分数时排名靠前。

2. 商品销量排名

考虑一个商品销售记录,需要按销量排名。

# 创建商品销量DataFrame
sales = pd.DataFrame({
    '商品': ['A', 'B', 'C', 'D', 'E'],
    '销量': [150, 200, 150, 250, 100]
})

# 按销量降序排名,使用dense方法(无间隔排名)
sales['排名'] = sales['销量'].rank(ascending=False, method='dense')
print(sales.sort_values(by='排名'))

输出:

  商品   销量  排名
3  D  250  1.0
1  B  200  2.0
0  A  150  3.0
2  C  150  3.0
4  E  100  4.0

解释:这里使用dense方法,销量相同的A和C都排名第3,下一个销量较低的E排名第4,没有间隔。

总结

通过本章节,你学习了Pandas中rank方法的进阶应用,包括基础排名、method参数配置、ascending参数控制排名方向、axis参数设置行或列排名,以及实战案例如学生成绩和商品销量排名。掌握这些技巧后,你可以灵活地为数据分配排名,满足各种分析需求。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包