生活、工作中经常遇到根据指定数据进行排名的问题。排名的算法有多种,比如常见的中国式排名和美国式排名。[大谦Excel,dqexcel点com]
中国式排名
【问题描述】
在DataFrame中,根据指定列对行数据进行中国式排名,中国式排名的规则,是将行数据根据指定列进行升序排列后,对于列中大小相同的数据,取它们名次中的最小值。
【示例3-36】
本例使用示例3-33的数据。请根据短跑成绩进行中国式排名。
- 编写下面的代码:
import pandas as pd
# 读取Excel文件
df = pd.read_excel('D:/Samples/ch03/07 数据排名/中国式排名/短跑成绩排名.xlsx', engine='openpyxl')
# 按照短跑成绩从小到大排序,并且进行排名
df['排名'] = df['短跑成绩(秒)'].rank(method='min').astype(int)
# 根据排名进行升序排序
df = df.sort_values(by=['排名'], ascending=True)
# 输出结果
print(df)
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出根据短跑成绩进行中国式排名的结果。
>>> === RESTART: D:/Samples/ch03/1.py ==
姓名 短跑成绩(秒) 排名
4 吴军 18 1
2 赵毅 19 2
0 李逵 20 3
3 张林 20 3
1 章旭 21 5
5 秦宝军 21 5
6 林东山 23 7
可见,李逵和张林按成绩排第3名和第4名,因为他们成绩相同,按中国式排名的规则,取他们名次的最小值,为并列第3名;同样,章旭和秦宝军两位同学并列第5名。
美国式排名
【问题描述】
在DataFrame中,根据指定列对行数据进行美国式排名,美国式排名的规则,是将行数据根据指定列进行升序排列后,对于列中大小相同的数据,取它们名次的均值。
【示例3-37】
本例使用示例3-33的数据。请根据短跑成绩进行美国式排名。
- 编写下面的代码:
import pandas as pd
file_path = r'D:/Samples/ch03/07 数据排名/美国式排名/短跑成绩排名.xlsx'
# 读取excel文件的数据
df = pd.read_excel(file_path, engine='openpyxl')
# 根据短跑成绩进行排名,rank函数的method参数的值取'average'
df['Rank'] = df['短跑成绩(秒)'].rank(method='average', ascending=True)
# 根据排名对行数据进行升序排列
df.sort_values(by='Rank', inplace=True)
print(df)
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出根据短跑成绩进行美国式排名的结果。
>>> === RESTART: D:/Samples/ch03/1.py ==
姓名 短跑成绩(秒) Rank
4 吴军 18 1.0
2 赵毅 19 2.0
0 李逵 20 3.5
3 张林 20 3.5
1 章旭 21 5.5
5 秦宝军 21 5.5
6 林东山 23 7.0
可见,李逵和张林按成绩排第3名和第4名,因为他们成绩相同,按美国式排名的规则,取他们名次的均值,为并列第3.5名;同样,章旭和秦宝军两位同学并列第5.5名。
【知识点扩展】
使用Series大小的rank方法可以快速实现数据排名。利用该方法的method参数,可以指定不同的排名算法。method参数的值为”min”时为中国式排名,为”average”时为美国式排名。除了这两种,还可以有其他排名算法。
method参数的值为”max”时根据短跑成绩排名的结果为:
姓名 短跑成绩(秒) 排名
4 吴军 18 1
2 赵毅 19 2
0 李逵 20 4
3 张林 20 4
1 章旭 21 6
5 秦宝军 21 6
6 林东山 23 7
此时,对于成绩相同的同学取他们名次的最大值。
method参数的值为”first”时根据短跑成绩排名的结果为:
姓名 短跑成绩(秒) 排名
4 吴军 18 1
2 赵毅 19 2
0 李逵 20 3
3 张林 20 4
1 章旭 21 5
5 秦宝军 21 6
6 林东山 23 7
此时排名从1到N没有间断,连续排名。
method参数的值为”dense”时根据短跑成绩排名的结果为:
姓名 短跑成绩(秒) 排名
4 吴军 18 1
2 赵毅 19 2
0 李逵 20 3
3 张林 20 3
1 章旭 21 4
5 秦宝军 21 4
6 林东山 23 5
此时虽然成绩相同的同学排名式并列的,但名次本身是连续取值的,称为紧凑排名。