13.2 数据排名(进阶,给数据分配排名)
Pandas数据排名教程:rank方法详解与实践应用
本章节详细讲解Pandas中的rank方法,包括基础排名、method参数配置(如average、min等)、ascending参数控制排名方向、axis参数设置行或列排名,并提供学生成绩和商品销量的实战应用示例,适合新手学习。
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参数设置行或列排名,以及实战案例如学生成绩和商品销量排名。掌握这些技巧后,你可以灵活地为数据分配排名,满足各种分析需求。