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

wen python案例 1

本文目录导读:

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

  1. 基础排名 - rank() 方法
  2. 不同的排名方法
  3. 分组排名
  4. 真实案例
  5. 排名后处理技巧
  6. 常见问题解决

我来给你详细介绍Pandas中做数据排名的各种方法和案例。

基础排名 - rank() 方法

基本示例

import pandas as pd
# 创建示例数据
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '孙七'],
    '成绩': [85, 92, 78, 92, 88],
    '年龄': [25, 23, 24, 25, 22]
})
print("原始数据:")
print(df)
# 基本排名(默认升序)
df['成绩排名'] = df['成绩'].rank()
print("\n默认排名(升序):")
print(df[['姓名', '成绩', '成绩排名']])

不同的排名方法

1 降序排名

# 降序排名(成绩高的排前面)
df['成绩排名_降序'] = df['成绩'].rank(ascending=False)
print("降序排名:")
print(df[['姓名', '成绩', '成绩排名_降序']])

2 不同平局处理方式

# 创建有平局的数据
df_scores = pd.DataFrame({
    '学生': ['A', 'B', 'C', 'D', 'E', 'F'],
    '分数': [95, 92, 92, 88, 88, 85]
})
print("各种排名方法对比:")
df_scores['average'] = df_scores['分数'].rank(method='average', ascending=False)
df_scores['min'] = df_scores['分数'].rank(method='min', ascending=False)
df_scores['max'] = df_scores['分数'].rank(method='max', ascending=False)
df_scores['dense'] = df_scores['分数'].rank(method='dense', ascending=False)
df_scores['first'] = df_scores['分数'].rank(method='first', ascending=False)
print(df_scores.round(2))

分组排名

1 按组排名

# 创建分组数据
df_group = pd.DataFrame({
    '班级': ['A班', 'A班', 'A班', 'B班', 'B班', 'B班'],
    '姓名': ['小明', '小红', '小华', '小刚', '小丽', '小强'],
    '成绩': [85, 92, 78, 88, 95, 82]
})
# 按班级分组排名
df_group['班级排名'] = df_group.groupby('班级')['成绩'].rank(ascending=False)
print("按班级分组排名:")
print(df_group.sort_values(['班级', '班级排名']))

2 多条件分组排名

# 按多个列分组
df_multi = pd.DataFrame({
    '年级': ['高一', '高一', '高一', '高二', '高二', '高二'],
    '班级': ['1班', '1班', '2班', '1班', '1班', '2班'],
    '姓名': ['A', 'B', 'C', 'D', 'E', 'F'],
    '成绩': [85, 92, 78, 88, 95, 82]
})
# 按年级和班级分组排名
df_multi['组内排名'] = df_multi.groupby(['年级', '班级'])['成绩'].rank(ascending=False)
print("多条件分组排名:")
print(df_multi.sort_values(['年级', '班级', '组内排名']))

真实案例

案例1:学生成绩排名

# 学生成绩排名系统
students_data = pd.DataFrame({
    '学号': [1001, 1002, 1003, 1004, 1005, 1006],
    '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
    '语文': [85, 92, 78, 92, 88, 90],
    '数学': [90, 85, 88, 92, 78, 85],
    '英语': [88, 90, 82, 85, 92, 88]
})
# 计算总分
students_data['总分'] = students_data['语文'] + students_data['数学'] + students_data['英语']
# 综合排名
students_data['总排名'] = students_data['总分'].rank(ascending=False, method='min')
# 各科排名
for subject in ['语文', '数学', '英语']:
    students_data[f'{subject}排名'] = students_data[subject].rank(ascending=False, method='dense')
print("学生成绩排名系统:")
print(students_data.sort_values('总排名'))

案例2:销售业绩排名

# 销售业绩排名
sales_data = pd.DataFrame({
    '销售员': ['A', 'B', 'C', 'D', 'E', 'F'] * 2,
    '月份': ['1月'] * 6 + ['2月'] * 6,
    '销售额': [5000, 8000, 6000, 7500, 9000, 6500,
               5500, 8500, 6200, 7800, 8800, 6700],
    '完成率': [0.85, 0.95, 0.90, 0.92, 0.98, 0.88,
               0.87, 0.96, 0.91, 0.93, 0.97, 0.89]
})
# 月度排名
sales_data['月度排名'] = sales_data.groupby('月份')['销售额'].rank(ascending=False, method='dense')
# 综合评分排名(考虑销售额和完成率)
sales_data['综合得分'] = sales_data['销售额'] * 0.7 + sales_data['完成率'] * 100 * 30
sales_data['综合排名'] = sales_data.groupby('月份')['综合得分'].rank(ascending=False)
print("销售业绩排名:")
print(sales_data.sort_values(['月份', '综合排名']))

案例3:数据分析实战

# 电商数据分析
import numpy as np
# 生成模拟数据
np.random.seed(42)
ecommerce_data = pd.DataFrame({
    '商品ID': range(1001, 1021),
    '类别': np.random.choice(['电子产品', '服装', '食品', '家居'], 20),
    '销量': np.random.randint(100, 1000, 20),
    '价格': np.random.randint(50, 500, 20),
    '评分': np.random.uniform(3.0, 5.0, 20).round(1)
})
# 计算销售额
ecommerce_data['销售额'] = ecommerce_data['销量'] * ecommerce_data['价格']
# 全局排名
ecommerce_data['销量排名'] = ecommerce_data['销量'].rank(ascending=False, method='dense')
ecommerce_data['销售额排名'] = ecommerce_data['销售额'].rank(ascending=False, method='dense')
# 类别内排名
ecommerce_data['类别销量排名'] = ecommerce_data.groupby('类别')['销量'].rank(ascending=False)
ecommerce_data['类别销售额排名'] = ecommerce_data.groupby('类别')['销售额'].rank(ascending=False)
print("电商数据排名分析:")
print(ecommerce_data.sort_values(['类别', '类别销售额排名']))

排名后处理技巧

1 生成排名标签

# 添加排名标签
df = pd.DataFrame({'成绩': [85, 92, 78, 92, 88, 95]})
df['排名'] = df['成绩'].rank(ascending=False, method='min').astype(int)
# 生成排名描述
df['排名标签'] = df['排名'].apply(lambda x: 
    '第{}名'.format(x) if x <= 3 else 
    f'第{x}名(前{x}/{len(df)})'
)
print("排名标签示例:")
print(df)

2 百分比排名

# 计算百分比排名
df['百分比排名'] = df['成绩'].rank(pct=True)
df['排名%'] = (df['百分比排名'] * 100).round(1)
print("\n百分比排名:")
print(df[['成绩', '排名', '排名%']])

常见问题解决

处理缺失值

# 处理包含NaN的数据
df_with_nan = pd.DataFrame({
    '分数': [85, 92, np.nan, 78, 92, 88, np.nan]
})
# 默认NaN会被排名
print("默认处理NaN:")
print(df_with_nan['分数'].rank())
# 先填充再排名
print("\n填充0后排名:")
df_cleaned = df_with_nan.fillna(0)
print(df_cleaned['分数'].rank())

这些案例涵盖了Pandas排名的主要应用场景,你可以根据具体需求选择合适的方法,记住关键点:

  • method参数控制平局处理
  • ascending控制升序降序
  • groupby实现分组排名
  • pct=True计算百分比排名

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