Python数据分组聚合:从入门到进阶的实战指南
在数据处理的日常工作中我们经常需要对数据进行分组再针对不同组进行统计计算——这就是“分组聚合”。它是探索数据规律、挖掘细分维度价值的核心操作在Python生态中pandas库是实现这一需求的首选工具。本文将从基础概念出发通过实战案例带你掌握分组聚合的全流程技巧。 核心概念分组聚合的底层逻辑分组聚合本质是一个“拆分-应用-合并”的过程拆分Split按照指定的一个或多个键将数据集划分为多个组应用Apply对每个组独立应用聚合函数求和、均值、计数等合并Combine将每个组的计算结果整合成最终的输出数据集源码分享网https://svipm.com.cn描述上千款各行各业的源码这个流程就像公司做业绩统计先按部门拆分团队再分别计算每个部门的总业绩、平均业绩最后汇总成公司业绩报表。️ 基础操作快速上手分组聚合我们先从最基础的单键分组开始使用pandas的groupby()方法完成核心操作。1. 准备示例数据Python复制import pandas as pd # 创建销售数据DataFrame data { 地区: [华东, 华北, 华南, 华东, 华北, 华南], 产品: [A, B, A, B, A, B], 销售额: [12000, 8000, 9500, 7000, 10500, 6500], 销量: [24, 16, 19, 14, 21, 13] } df pd.DataFrame(data)2. 单键分组单一聚合函数按“地区”分组计算每个地区的总销售额Python复制# 按地区分组聚合销售额的总和 grouped_region df.groupby(地区)[销售额].sum() print(grouped_region)输出结果地区 华东 19000 华南 16000 华北 18500 Name: 销售额, dtype: int643. 单键分组多个聚合函数同时计算每个地区的总销售额和平均销量Python复制grouped_multi df.groupby(地区).agg( 总销售额(销售额, sum), 平均销量(销量, mean) ) print(grouped_multi)输出结果总销售额 平均销量 地区 华东 19000 19.0 华南 16000 16.0 华北 18500 18.5⚡ 进阶技巧复杂场景的分组聚合实际工作中我们常遇到更复杂的分组需求比如多键分组、自定义聚合函数等以下是高频场景的解决方案1. 多键分组同时按“地区”和“产品”分组统计每个地区每种产品的销售数据Python复制grouped_double df.groupby([地区, 产品]).agg( 总销售额(销售额, sum), 总销量(销量, sum) ) print(grouped_double)输出结果总销售额 总销量 地区 产品 华东 A 12000 24 B 7000 14 华南 A 9500 19 B 6500 13 华北 A 10500 21 B 8000 162. 自定义聚合函数如果内置的聚合函数无法满足需求我们可以自定义函数通过agg()方法调用Python复制# 自定义函数计算销售额与销量的比值客单价 def calculate_unit_price(x): return x[销售额].sum() / x[销量].sum() # 按地区分组应用自定义函数 grouped_custom df.groupby(地区).apply(calculate_unit_price) print(grouped_custom)输出结果地区 华东 500.000000 华南 500.000000 华北 500.000000 dtype: float64可以看到所有产品的客单价均为500符合我们设置的初始数据逻辑销售额销量×500。3. 分组后的数据转换除了聚合计算我们还可以对分组后的数据进行标准化、排序等转换操作。比如计算每个地区销售额占该地区总销售额的比例Python复制# 计算每个地区的总销售额 region_total df.groupby(地区)[销售额].transform(sum) # 计算占比 df[销售额占比] df[销售额] / region_total print(df)输出结果地区 产品 销售额 销量 销售额占比 0 华东 A 12000 24 0.631579 1 华北 B 8000 16 0.432432 2 华南 A 9500 19 0.593750 3 华东 B 7000 14 0.368421 4 华北 A 10500 21 0.567568 5 华南 B 6500 13 0.406250 实战案例电商用户行为数据分析我们用一个更贴近真实业务的案例展示分组聚合的实际应用价值。假设我们有一份电商用户行为数据包含用户ID、商品类别、购买金额和购买时间Python复制import numpy as np # 生成模拟电商数据 np.random.seed(42) dates pd.date_range(start2026-01-01, end2026-01-31, freqD) user_ids np.random.randint(1000, 1100, size1000) categories np.random.choice([电子产品, 服饰鞋包, 家居用品], size1000) amounts np.random.randint(50, 5000, size1000) purchase_dates np.random.choice(dates, size1000) ecom_data pd.DataFrame({ 用户ID: user_ids, 商品类别: categories, 购买金额: amounts, 购买日期: purchase_dates }) # 提取月份和周几信息 ecom_data[月份] ecom_data[购买日期].dt.month ecom_data[周几] ecom_data[购买日期].dt.day_name()我们可以通过分组聚合回答以下业务问题每个商品类别的总销售额和订单量Python复制category_analysis ecom_data.groupby(商品类别).agg( 总销售额(购买金额, sum), 订单量(用户ID, count) ) print(category_analysis)每周各天的平均客单价Python复制weekday_analysis ecom_data.groupby(周几)[购买金额].mean().sort_values(ascendingFalse) print(weekday_analysis)每个用户的累计消费金额和购买频次Python复制user_analysis ecom_data.groupby(用户ID).agg( 累计消费(购买金额, sum), 购买频次(购买日期, count) ) # 筛选出累计消费超过5000的高价值用户 high_value_users user_analysis[user_analysis[累计消费] 5000] print(high_value_users.head()) 性能优化大数据量下的分组技巧当处理百万级以上的数据集时分组聚合的性能会成为瓶颈以下是几个优化方向减少分组前的数据量先过滤掉不需要的列和行再进行分组操作使用cudf替代pandas如果有GPU资源NVIDIA的cudf库可以实现10-100倍的加速选择合适的分组键对于字符串类型的分组键可以先转换为分类类型astype(category)减少内存占用和计算时间避免嵌套分组尽量使用多键分组替代多层嵌套的groupby操作