Python案例如何用Pandas做数据排名统计

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据排名统计

  1. 基础排名:rank() 方法
  2. 分组排名
  3. 排序与排名结合
  4. 实战案例:学生成绩排名统计
  5. 高级排名统计
  6. 完整示例:销售业绩排名系统
  7. 排名统计可视化
  8. 关键参数说明

我来详细介绍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 返回百分位数排名

这些方法可以满足大多数数据排名统计的需求,根据具体场景选择合适的排名方法非常重要。

抱歉,评论功能暂时关闭!