数据排名

生活、工作中经常遇到根据指定数据进行排名的问题。排名的算法有多种,比如常见的中国式排名和美国式排名。[大谦Excel,dqexcel点com]

中国式排名

【问题描述】

在DataFrame中,根据指定列对行数据进行中国式排名,中国式排名的规则,是将行数据根据指定列进行升序排列后,对于列中大小相同的数据,取它们名次中的最小值。

【示例3-36】

本例使用示例3-33的数据。请根据短跑成绩进行中国式排名。

  • ChatGPT提示词模板

新建ChatGPT会话,在提问文本框中输入下面的提示词:

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/07 数据排名/中国式排名/短跑成绩排名.xlsx。该Excel文件的第一个工作表中A1:B8为给定数据,A-B列分别为“姓名”和“短跑成绩(秒)”数据。用pandas导入Excel文件的数据,第1行为索引行,引擎为"openpyxl",请根据短跑成绩进行排名,用时越少排名越靠前。排名为整数,采用中国式排名,名次相同时取最小名次,数据添加在最后一列。根据排名对行数据进行升序排列。

2. ChatGPT提示词模板说明

需要明确指定排名规则,说明用时越少排名越靠前,解释什么是中国式排名。排名要是整数。最后根据排名对行数据进行升序排列。

3. 代码

  • 根据提示词得到类似下面的代码:
code.python
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)

4. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出根据短跑成绩进行中国式排名的结果。

code.python
>>> === 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的数据。请根据短跑成绩进行美国式排名。

  • ChatGPT提示词模板

新建ChatGPT会话,在提问文本框中输入下面的提示词:

prompt
你是pandas专家,文件路径为:D:/Samples/ch03/07 数据排名/美国式排名/短跑成绩排名.xlsx。该Excel文件的第一个工作表中A1:B8为给定数据,A-B列分别为“姓名”和“短跑成绩(秒)”数据。用pandas导入Excel文件的数据,第1行为索引行,引擎为"openpyxl",请根据短跑成绩进行排名,用时越少排名越靠前。采用美国式排名,rank函数的method参数的值取'average'。排名数据添加在最后一列。根据排名对行数据进行升序排列。

2. ChatGPT提示词模板说明

需要明确指定排名规则,说明用时越少排名越靠前,解释什么是美国式排名。最后根据排名对行数据进行升序排列。因为要求均值,所以这里排名不一定是整数。

3. 代码

  • 根据提示词得到类似下面的代码:
code.python
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)

4. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出根据短跑成绩进行美国式排名的结果。

code.python
>>> === 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”时根据短跑成绩排名的结果为:

code.python
    姓名  短跑成绩(秒)  排名
4   吴军       18   1
2   赵毅       19   2
0   李逵       20   4
3   张林       20   4
1   章旭       21   6
5  秦宝军       21   6
6  林东山       23   7

此时,对于成绩相同的同学取他们名次的最大值。

method参数的值为”first”时根据短跑成绩排名的结果为:

code.python
    姓名  短跑成绩(秒)  排名
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”时根据短跑成绩排名的结果为:

code.python
    姓名  短跑成绩(秒)  排名
4   吴军       18   1
2   赵毅       19   2
0   李逵       20   3
3   张林       20   3
1   章旭       21   4
5  秦宝军       21   4
6  林东山       23   5

此时虽然成绩相同的同学排名式并列的,但名次本身是连续取值的,称为紧凑排名。