本文目录导读:

我来给你详细介绍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计算百分比排名
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播