本文目录导读:

我来给你详细介绍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计算百分比排名