生活、工作中经常遇到根据指定数据进行排名的问题。排名的算法有多种,比如常见的中国式排名和美国式排名。[大谦Excel,dqexcel点com]
中国式排名
【问题描述】
在DataFrame中,根据指定列对行数据进行中国式排名,中国式排名的规则,是将行数据根据指定列进行升序排列后,对于列中大小相同的数据,取它们名次中的最小值。
【示例3-36】
本例使用示例3-33的数据。请根据短跑成绩进行中国式排名。
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch03/07 数据排名/中国式排名/短跑成绩排名.xlsx。该Excel文件的第一个工作表中A1:B8为给定数据,A-B列分别为“姓名”和“短跑成绩(秒)”数据。用pandas导入Excel文件的数据,第1行为索引行,引擎为"openpyxl",请根据短跑成绩进行排名,用时越少排名越靠前。排名为整数,采用中国式排名,名次相同时取最小名次,数据添加在最后一列。根据排名对行数据进行升序排列。
2. ChatGPT提示词模板说明
需要明确指定排名规则,说明用时越少排名越靠前,解释什么是中国式排名。排名要是整数。最后根据排名对行数据进行升序排列。
3. 代码
- 根据提示词得到类似下面的代码:
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窗口输出根据短跑成绩进行中国式排名的结果。
>>> === 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会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch03/07 数据排名/美国式排名/短跑成绩排名.xlsx。该Excel文件的第一个工作表中A1:B8为给定数据,A-B列分别为“姓名”和“短跑成绩(秒)”数据。用pandas导入Excel文件的数据,第1行为索引行,引擎为"openpyxl",请根据短跑成绩进行排名,用时越少排名越靠前。采用美国式排名,rank函数的method参数的值取'average'。排名数据添加在最后一列。根据排名对行数据进行升序排列。
2. ChatGPT提示词模板说明
需要明确指定排名规则,说明用时越少排名越靠前,解释什么是美国式排名。最后根据排名对行数据进行升序排列。因为要求均值,所以这里排名不一定是整数。
3. 代码
- 根据提示词得到类似下面的代码:
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窗口输出根据短跑成绩进行美国式排名的结果。
>>> === 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
此时虽然成绩相同的同学排名式并列的,但名次本身是连续取值的,称为紧凑排名。