本文目录导读:

我来详细介绍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 |
返回百分位数排名 |
这些方法可以满足大多数数据排名统计的需求,根据具体场景选择合适的排名方法非常重要。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播