本文目录导读:

我来详细介绍Pandas中做数据排名统计的几种常用方法。
基础排名:rank() 方法
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'成绩': [85, 92, 78, 92, 88],
'班级': ['A班', 'A班', 'B班', 'B班', 'A班']
})
基本排名
# 默认排名(平均排名) df['排名_默认'] = df['成绩'].rank() # 最小排名(类似竞赛排名) df['排名_最小'] = df['成绩'].rank(method='min') # 最大排名 df['排名_最大'] = df['成绩'].rank(method='max') # 密集排名(不跳过序列号) df['排名_密集'] = df['成绩'].rank(method='dense') # 第一排名(按出现顺序) df['排名_第一'] = df['成绩'].rank(method='first') print(df)
分组排名
# 按班级分组排名
df['班级内排名'] = df.groupby('班级')['成绩'].rank(ascending=False)
# 多条件分组排名
df2 = pd.DataFrame({
'年级': ['高一', '高一', '高二', '高二', '高一'],
'班级': ['1班', '2班', '1班', '2班', '1班'],
'成绩': [85, 92, 78, 88, 90]
})
df2['年级班级内排名'] = df2.groupby(['年级', '班级'])['成绩'].rank(ascending=False)
排序与排名结合
# 按成绩降序排序
df_sorted = df.sort_values('成绩', ascending=False)
# 创建排名列并排序
df['排名'] = df['成绩'].rank(method='min', ascending=False)
df_sorted = df.sort_values('排名')
# 获取Top N
top3 = df.nlargest(3, '成绩')
bottom3 = df.nsmallest(3, '成绩')
实战案例:学生成绩排名统计
# 创建更完整的数据集
students = pd.DataFrame({
'学号': ['S001', 'S002', 'S003', 'S004', 'S005', 'S006'],
'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
'语文': [85, 92, 78, 88, 90, 82],
'数学': [90, 85, 95, 88, 82, 91],
'英语': [88, 90, 82, 85, 92, 86]
})
# 计算总分
students['总分'] = students[['语文', '数学', '英语']].sum(axis=1)
students['平均分'] = students[['语文', '数学', '英语']].mean(axis=1).round(1)
# 多维度排名
students['总分排名'] = students['总分'].rank(method='min', ascending=False)
students['语文排名'] = students['语文'].rank(method='min', ascending=False)
students['数学排名'] = students['数学'].rank(method='min', ascending=False)
students['英语排名'] = students['英语'].rank(method='min', ascending=False)
# 按总分排序
students_sorted = students.sort_values('总分排名')
print("学生成绩排名表:")
print(students_sorted[['学号', '姓名', '总分', '总分排名', '平均分']])
高级排名统计
# 百分位数排名
df['百分位排名'] = df['成绩'].rank(pct=True)
# 分位数
df['分位数'] = pd.qcut(df['成绩'], q=4, labels=['D', 'C', 'B', 'A'])
# 排名变化
sales = pd.DataFrame({
'月份': ['1月', '2月', '3月', '4月'],
'销售额': [100, 150, 120, 180]
})
sales['上月排名'] = sales['销售额'].rank().shift(1)
sales['排名变化'] = sales['销售额'].rank() - sales['上月排名']
print("销售排名变化:")
print(sales)
完整示例:销售业绩排名系统
# 创建销售数据
sales_data = pd.DataFrame({
'销售员': ['小王', '小李', '小张', '小赵', '小刘', '小陈'],
'部门': ['A部', 'A部', 'B部', 'B部', 'A部', 'B部'],
'1月业绩': [5000, 8000, 6000, 7500, 5500, 7000],
'2月业绩': [6000, 7500, 6500, 8000, 5800, 7200],
'3月业绩': [5500, 9000, 6200, 7800, 6000, 7500]
})
# 计算季度总业绩
sales_data['季度总业绩'] = sales_data[['1月业绩', '2月业绩', '3月业绩']].sum(axis=1)
# 部门内排名
sales_data['部门排名'] = sales_data.groupby('部门')['季度总业绩'].rank(
method='min', ascending=False
)
# 全公司排名
sales_data['公司排名'] = sales_data['季度总业绩'].rank(
method='min', ascending=False
)
# 等级评定(基于排名)
def get_grade(rank, total):
if rank <= total * 0.2: # 前20%
return 'A'
elif rank <= total * 0.5: # 前50%
return 'B'
elif rank <= total * 0.8: # 前80%
return 'C'
else:
return 'D'
total_employees = len(sales_data)
sales_data['等级'] = sales_data['公司排名'].apply(
lambda x: get_grade(x, total_employees)
)
# 输出结果
result = sales_data.sort_values('公司排名')
print("销售业绩排名统计:")
print(result[['销售员', '部门', '季度总业绩', '公司排名', '部门排名', '等级']])
排名统计可视化
import matplotlib.pyplot as plt
# 排名分布统计
rank_stats = pd.DataFrame({
'排名区间': ['1-2', '3-4', '5-6'],
'人数': [2, 2, 2],
'平均业绩': sales_data.groupby(
pd.cut(sales_data['公司排名'], bins=[0, 2, 4, 6])
)['季度总业绩'].mean()
})
print("排名区间统计:")
print(rank_stats)
关键参数说明
| 参数 | 说明 |
|---|---|
method='average' |
相同值取平均排名(默认) |
method='min' |
相同值取最小排名 |
method='max' |
相同值取最大排名 |
method='first' |
按出现顺序排名 |
method='dense' |
密集排名,不跳过序号 |
ascending=True |
升序排名(默认) |
ascending=False |
降序排名 |
pct=True |
返回百分位数排名 |
这些方法可以满足大多数数据排名统计的需求,根据具体场景选择合适的排名方法非常重要。