13.3 数据排序与排名实战案例
Pandas数据排序与排名实战案例详解 - Python数据分析教程
本章节通过三个实战案例,详细讲解Pandas中数据排序与排名的核心操作,包括按单列/多列排序提取TopN数据、学生成绩排名处理并列情况以及按索引排序对齐数据进行分析,适合数据分析新手快速上手。
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中的排序与排名技巧,应用到实际数据分析项目中。多动手练习,结合具体数据集实践,效果更佳!