Pandas 中文手册

13.3 数据排序与排名实战案例

Pandas数据排序与排名实战案例详解 - Python数据分析教程

Pandas 中文手册

本章节通过三个实战案例,详细讲解Pandas中数据排序与排名的核心操作,包括按单列/多列排序提取TopN数据、学生成绩排名处理并列情况以及按索引排序对齐数据进行分析,适合数据分析新手快速上手。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Pandas数据排序与排名实战案例

排序和排名是数据分析中的基础操作,能帮助我们快速找到关键数据、进行趋势分析或对齐不同数据集。本章节通过实战案例,带你掌握Pandas中的数据排序与排名技巧。

案例1:按单列/多列排序,提取TopN数据

按列排序常用于提取最高值或最低值数据,例如分析销售数据中的TopN产品。

按单列排序

使用sort_values()方法,指定by参数按某一列排序,ascending参数控制升序(默认True)或降序。

示例代码:

import pandas as pd

# 创建一个示例DataFrame
数据 = pd.DataFrame({
    '产品': ['A', 'B', 'C', 'D', 'E'],
    '销售额': [100, 150, 90, 200, 120]
})

# 按销售额降序排序
排序_数据 = 数据.sort_values(by='销售额', ascending=False)
print("按销售额降序排序:")
print(排序_数据)

解释: 这里按“销售额”列降序排序,快速查看哪些产品表现最佳。

按多列排序

按多列排序时,指定by为一个列名列表,优先级从高到低。

示例代码:

# 添加一列“类别”
数据['类别'] = ['电子产品', '电子产品', '家具', '电子产品', '家具']

# 先按类别升序,再按销售额降序排序
多列_排序 = 数据.sort_values(by=['类别', '销售额'], ascending=[True, False])
print("按类别和销售额排序:")
print(多列_排序)

解释: 这样可以先按类别分组,再在每个类别内找出销售额最高的产品。

提取TopN数据

使用head()方法提取前N行,或切片方式获取。

示例代码:

# 提取销售额前3的产品
top_3 = 排序_数据.head(3)
print("Top 3 产品:")
print(top_3)

提示: 对于降序排序的DataFrame,head(N)提取最高值;升序排序则提取最低值。


案例2:对学生成绩进行排名,处理并列排名

排名常用于学生成绩、比赛名次等场景,Pandas的rank()方法支持处理并列排名。

基本排名操作

rank()方法默认使用平均排名(method='average')处理并列。

示例代码:

# 创建学生成绩DataFrame
成绩 = pd.DataFrame({
    '学生': ['小明', '小红', '小刚', '小李', '小张'],
    '数学': [85, 92, 85, 78, 92],
    '英语': [90, 88, 92, 85, 95]
})

# 对数学成绩进行排名
成绩['数学_排名'] = 成绩['数学'].rank(ascending=False)  # 降序排名,越高越好
print("学生成绩及数学排名:")
print(成绩)

解释: 小明和小刚都得了85分,排名为3.5(平均排名),避免了名次跳跃。

处理并列排名的不同方法

method参数可选值:

  • 'average':平均排名(默认)。
  • 'min':最小排名(并列都取最小名次)。
  • 'max':最大排名(并列都取最大名次)。
  • 'first':按数据出现的顺序分配名次(不常用)。
  • 'dense':密集排名,并列名次相同且不跳过名次。

示例代码:

# 尝试不同排名方法
成绩['数学_排名_min'] = 成绩['数学'].rank(method='min', ascending=False)
成绩['数学_排名_max'] = 成绩['数学'].rank(method='max', ascending=False)
成绩['数学_排名_dense'] = 成绩['数学'].rank(method='dense', ascending=False)
print("不同排名方法对比:")
print(成绩[['学生', '数学', '数学_排名', '数学_排名_min', '数学_排名_max', '数学_排名_dense']])

应用: 根据不同需求选择排名方法,例如比赛使用'max'确保公平,或报告使用'dense'保持名次连续。


案例3:按索引排序,对齐数据后进行分析

按索引排序常用于对齐时间序列或合并不同数据集,便于后续分析。

按索引排序

使用sort_index()方法对DataFrame的索引进行排序。

示例代码:

# 创建一个时间序列示例,索引为日期
日期_数据 = pd.DataFrame({
    '温度': [22, 24, 20, 23, 25],
    '湿度': [60, 55, 65, 58, 62]
}, index=pd.date_range('2023-01-01', periods=5))

# 假设索引乱序
乱序_索引 = 日期_数据.sample(frac=1)  # 随机打乱顺序
print("乱序索引数据:")
print(乱序_索引)

# 按索引排序
排序_索引 = 乱序_索引.sort_index()
print("按索引排序后:")
print(排序_索引)

解释: 排序后,索引按时间顺序排列,方便绘制图表或计算差异。

对齐数据后进行分析

索引对齐是合并或比较DataFrame的基础。

示例代码:

# 创建两个相关数据集
数据1 = pd.DataFrame({'销量': [100, 150, 200]}, index=['A', 'B', 'C'])
数据2 = pd.DataFrame({'利润': [20, 25, 30]}, index=['B', 'C', 'D'])

# 对齐索引后计算利润率(利润/销量)
# 首先确保索引排序
数据1 = 数据1.sort_index()
数据2 = 数据2.sort_index()

# 对齐:Pandas操作会自动对齐索引,但需注意缺失值
对齐_数据 = pd.concat([数据1, 数据2], axis=1, sort=True)  # sort=True确保索引排序
print("对齐后数据:")
print(对齐_数据)

# 计算利润率,使用fillna处理缺失值
对齐_数据['利润率'] = 对齐_数据['利润'] / 对齐_数据['销量'].fillna(1)  # 简化处理
print("计算利润率:")
print(对齐_数据)

分析: 对齐后,可以轻松比较不同索引对应的数据,例如这里计算了利润率,但需注意索引不匹配时的NaN值处理。

总结

  • 排序:使用sort_values()按列排序,sort_index()按索引排序,帮助提取TopN或对齐数据。
  • 排名rank()方法提供多种排名方式,灵活处理并列情况,适用于成绩、比赛等场景。
  • 对齐:排序索引后,DataFrame操作如合并或计算能自动对齐,提升分析效率。

通过这三个实战案例,你可以快速掌握Pandas中的排序与排名技巧,应用到实际数据分析项目中。多动手练习,结合具体数据集实践,效果更佳!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包