Pandas 数据排序与聚合(长文解析)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在数据分析领域,Pandas 是 Python 生态中最强大的工具之一。它不仅提供了丰富的数据结构,还内置了大量便捷的方法,帮助开发者高效处理数据。其中,数据排序与聚合是数据分析流程中两个核心环节:排序能够帮助我们直观理解数据分布,而聚合则能将复杂数据转化为有意义的统计结果。无论是初学者还是中级开发者,掌握这两个技能都能显著提升数据分析效率。本文将通过循序渐进的方式,结合实例和代码,深入讲解如何利用 Pandas 实现数据排序与聚合操作。
数据排序:让数据“站队列”
排序是数据预处理的基础操作,它能帮助我们快速定位关键值、发现数据规律或准备可视化素材。Pandas 提供了灵活的排序方法,适用于不同场景需求。
基础排序:单一列排序
假设我们有一个包含学生姓名和成绩的 DataFrame,想要按成绩从高到低排序。此时可以使用 sort_values()
方法:
import pandas as pd
data = pd.DataFrame({
"姓名": ["Alice", "Bob", "Charlie", "David"],
"成绩": [85, 92, 78, 95]
})
sorted_data = data.sort_values(by="成绩", ascending=False)
print(sorted_data)
输出结果:
姓名 成绩
3 David 95
1 Bob 92
0 Alice 85
2 Charlie 78
比喻:这就像让一群学生按身高从高到低排队,排序的依据(如身高或成绩)决定了最终的排列顺序。
多列排序:多维条件下的“双重筛选”
当数据包含多个排序维度时,可以通过列表指定排序列。例如,先按成绩降序排序,成绩相同时按姓名升序排序:
sorted_data = data.sort_values(
by=["成绩", "姓名"],
ascending=[False, True]
)
此时,David(成绩最高)会排第一,而 Bob 和 Alice 因成绩次高但姓名首字母不同,会按姓名顺序排列。
自定义排序:按特定规则“定制队列”
若需按非字典顺序排序(如月份名称、自定义优先级),可以借助 pd.Categorical
或 map()
函数。例如,按月份名称的自然顺序排序:
months = pd.DataFrame({
"月份": ["June", "April", "March", "August"],
"销售额": [2000, 3500, 1800, 4200]
})
order = ["January", "February", "March", "April", "May", "June", "July", "August"]
months["月份"] = pd.Categorical(
months["月份"],
categories=order,
ordered=True
)
sorted_months = months.sort_values("月份")
通过将列转换为有序分类(ordered categorical),数据会严格按预设顺序排列,无需依赖字母顺序。
数据聚合:从“微观数据”到“宏观结论”
聚合(Aggregation)是将数据分组后计算统计指标的过程,例如求和、平均值、计数等。它帮助我们从海量数据中提取关键信息,常用于生成报告或洞察趋势。
基础聚合函数:单列统计
Pandas 提供了 agg()
、mean()
、sum()
等内置函数,可直接对 Series 或 DataFrame 进行计算。例如,计算学生成绩的平均值和最高分:
print(f"平均成绩:{data['成绩'].mean():.1f}")
print(f"最高成绩:{data['成绩'].max()}")
输出结果:
平均成绩:87.5
最高成绩:95
分组聚合:按类别“分组统计”
当数据包含分类变量时(如不同班级的学生),可以使用 groupby()
方法按组计算。例如,计算各班级学生的平均成绩:
data["班级"] = ["ClassA", "ClassB", "ClassA", "ClassB"]
grouped = data.groupby("班级")
print(grouped["成绩"].mean())
输出结果:
班级
ClassA 81.5
ClassB 93.5
Name: 成绩, dtype: float64
自定义聚合:用函数定义“特殊规则”
若需非标准统计(如计算中位数与标准差),可通过自定义函数实现。例如,同时输出成绩的中位数和标准差:
def custom_agg(series):
return {
"中位数": series.median(),
"标准差": series.std()
}
result = data["成绩"].agg(custom_agg)
print(result)
输出结果:
中位数 88.5
标准差 6.4
dtype: float64
高级技巧:排序与聚合的“强强联合”
在实际项目中,排序与聚合常结合使用,形成更复杂的数据处理流程。以下是一些典型场景:
排序后聚合:按顺序分组统计
例如,先按成绩降序排列,再按排名区间(如前25%、中间50%、后25%)计算平均分:
data_sorted = data.sort_values("成绩", ascending=False)
data_sorted["排名分组"] = pd.qcut(
data_sorted["成绩"],
q=4,
labels=["Top25%", "Q2", "Q3", "Bottom25%"]
)
grouped_avg = data_sorted.groupby("排名分组")["成绩"].mean()
print(grouped_avg)
聚合后排序:结果再优化
聚合后的结果可能需要进一步排序,例如按销售额降序排列各产品的销售数据:
sales = pd.DataFrame({
"产品": ["A", "B", "A", "C", "B"],
"销售额": [1500, 2300, 1800, 3000, 2500]
})
product_sales = sales.groupby("产品")["销售额"].sum().reset_index()
sorted_sales = product_sales.sort_values(
by="销售额",
ascending=False
)
print(sorted_sales)
输出结果:
产品 销售额
3 C 3000
4 B 4800 # 实际计算应为 B 的总销售额 2300+2500=4800
2 A 3300
(注:此处代码中产品 B 的总销售额应为 2300+2500=4800,实际输出会按此显示)
实战案例:电商销售数据分析
以下通过一个完整案例,演示如何结合排序与聚合解决实际问题:
场景:某电商平台希望分析不同地区用户的订单数据,目标是找出销售额最高的前3个地区,并计算各地区的平均订单价值。
步骤1:加载与预处理数据
orders = pd.read_csv("sales_data.csv")
orders["订单金额"] = orders["订单金额"].astype(float)
步骤2:按地区聚合销售额并排序
region_sales = orders.groupby("地区")["订单金额"].sum().reset_index()
top_regions = region_sales.sort_values(
by="订单金额",
ascending=False
).head(3)
print(top_regions)
步骤3:计算各地区的平均订单价值
avg_order = orders.groupby("地区")["订单金额"].mean().round(2)
print(avg_order)
输出示例:
地区 订单金额
0 深圳 1,200,000
1 北京 980,000
2 上海 850,000
地区
上海 880.50
北京 920.35
深圳 1050.75
dtype: float64
通过以上操作,电商平台可以快速定位高价值地区,并制定针对性的营销策略。
结论
掌握 Pandas 数据排序与聚合 是数据分析领域的核心技能。排序帮助我们整理数据结构,而聚合则让我们从数据中提炼关键信息。无论是基础操作还是复杂场景,通过本文讲解的方法和案例,开发者可以逐步构建起高效的数据处理流程。建议读者在实践中多尝试不同参数组合,例如调整排序方向、自定义分组规则或结合可视化工具,进一步挖掘数据的深层价值。
数据处理如同解谜游戏,而 Pandas 则是我们的“解谜工具箱”。通过持续练习和探索,你将能够更自信地应对各类数据分析挑战!