Pandas 数据排序与聚合(长文解析)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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.Categoricalmap() 函数。例如,按月份名称的自然顺序排序:

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 则是我们的“解谜工具箱”。通过持续练习和探索,你将能够更自信地应对各类数据分析挑战!

最新发布