当前位置: 首页 > news >正文

Python数据分组聚合:从入门到进阶的实战指南

在数据处理的日常工作中,我们经常需要对数据进行分组,再针对不同组进行统计计算——这就是“分组聚合”。它是探索数据规律、挖掘细分维度价值的核心操作,在Python生态中,pandas库是实现这一需求的首选工具。本文将从基础概念出发,通过实战案例带你掌握分组聚合的全流程技巧。


📚 核心概念:分组聚合的底层逻辑

分组聚合本质是一个“拆分-应用-合并”的过程:

  1. 拆分(Split):按照指定的一个或多个键,将数据集划分为多个组
  2. 应用(Apply):对每个组独立应用聚合函数(求和、均值、计数等)
  3. 合并(Combine):将每个组的计算结果整合成最终的输出数据集
  4. 源码分享网:https://svipm.com.cn(描述:上千款各行各业的源码)

这个流程就像公司做业绩统计:先按部门拆分团队,再分别计算每个部门的总业绩、平均业绩,最后汇总成公司业绩报表。


🛠️ 基础操作:快速上手分组聚合

我们先从最基础的单键分组开始,使用pandasgroupby()方法完成核心操作。

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: int64
3. 单键分组+多个聚合函数

同时计算每个地区的总销售额和平均销量:

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 16
2. 自定义聚合函数

如果内置的聚合函数无法满足需求,我们可以自定义函数,通过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(start="2026-01-01", end="2026-01-31", freq="D") user_ids = np.random.randint(1000, 1100, size=1000) categories = np.random.choice(["电子产品", "服饰鞋包", "家居用品"], size=1000) amounts = np.random.randint(50, 5000, size=1000) purchase_dates = np.random.choice(dates, size=1000) ecom_data = pd.DataFrame({ "用户ID": user_ids, "商品类别": categories, "购买金额": amounts, "购买日期": purchase_dates }) # 提取月份和周几信息 ecom_data["月份"] = ecom_data["购买日期"].dt.month ecom_data["周几"] = ecom_data["购买日期"].dt.day_name()

我们可以通过分组聚合回答以下业务问题:

  1. 每个商品类别的总销售额和订单量

Python

复制

category_analysis = ecom_data.groupby("商品类别").agg( 总销售额=("购买金额", "sum"), 订单量=("用户ID", "count") ) print(category_analysis)

  1. 每周各天的平均客单价

Python

复制

weekday_analysis = ecom_data.groupby("周几")["购买金额"].mean().sort_values(ascending=False) print(weekday_analysis)

  1. 每个用户的累计消费金额和购买频次

Python

复制

user_analysis = ecom_data.groupby("用户ID").agg( 累计消费=("购买金额", "sum"), 购买频次=("购买日期", "count") ) # 筛选出累计消费超过5000的高价值用户 high_value_users = user_analysis[user_analysis["累计消费"] > 5000] print(high_value_users.head())


💡 性能优化:大数据量下的分组技巧

当处理百万级以上的数据集时,分组聚合的性能会成为瓶颈,以下是几个优化方向:

  1. 减少分组前的数据量:先过滤掉不需要的列和行,再进行分组操作
  2. 使用cudf替代pandas:如果有GPU资源,NVIDIA的cudf库可以实现10-100倍的加速
  3. 选择合适的分组键:对于字符串类型的分组键,可以先转换为分类类型(astype('category')),减少内存占用和计算时间
  4. 避免嵌套分组:尽量使用多键分组替代多层嵌套的groupby操作
http://www.jsqmd.com/news/550685/

相关文章:

  • 从轮询到DMA:STM32 ADC注入组+PWM触发的相电流采样方案全解析
  • 好用还专业!2026年实力出众的专业降AIGC平台
  • 5步掌握SillyTavern:打造你的专属AI角色聊天室终极指南
  • 解决Ubuntu18.04网络共享中的常见问题:从Permission denied到外网访问失败
  • 带隙基准,二阶温度补偿电路 [1]带启动电路,无版图,提供的工艺smic180nm [2]输入...
  • 避坑指南:Lattice Radiant 2024.2安装后打不开?检查这3个地方(License配置与环境变量)
  • 中老年人腰椎退行性病变,养护比治疗更重要
  • 北京上门收酒哪家靠谱?亚南酒业回收茅台老酒,无套路当场结算 - 品牌排行榜单
  • Qwen3-ForcedAligner计算机网络应用:分布式语音标注系统
  • 软考 系统架构设计师历年真题集萃(230)
  • Proteus虚拟终端实战:从串口调试到Arduino数据可视化
  • 干货合集:AI智能降重工具测评与最新推荐
  • 兰亭妙微交互设计方法论:UI设计师必须掌握的八大核心模块与落地技巧 - ui设计公司兰亭妙微
  • 行业观察|智能体破局会务痛点:报名签到与查座,才是线下活动的核心刚需!
  • 永磁同步电机双矢量模型预测电流控制的EI论文复现之旅
  • Windows下PaddleOCR虚拟环境配置避坑指南:从CUDA版本选择到zlibwapi.dll缺失解决
  • NoFences终极指南:3步打造零杂乱的高效Windows桌面
  • 如何用ESP32打造一个能听懂、会思考、能控制的AI语音助手?
  • 实测才敢推!2026年最值得信赖的专业降AI率工具
  • 突破Windows输入瓶颈:Interceptor驱动级交互技术全解析
  • RT-Thread v5.2.2升级后,我踩过的3个坑和5个性能提升点(附实测数据)
  • 快马AI一键生成链表可视化原型,交互演示助力算法设计
  • 从光模块到同轴电缆:手把手教你用Vivado IBERT完成两种高速接口的误码率测试
  • AD实战:从零到一构建你的首块PCB(避坑指南与效率心法)
  • 解决Cursor试用限制:软件重置工具全流程操作指南
  • 从零部署LoongArch服务器:OpenAnolis vs OpenEuler性能实测与选型指南
  • SonarQube扫完代码全是英文看不懂?手把手教你汉化界面与配置中文规则集
  • LeetCode-Day9-C++
  • Serial Port Plotter:嵌入式开发者的实时数据可视化终极指南 [特殊字符]
  • 软萌拆拆屋企业应用:服装厂用Nano-Banana生成产前样衣结构说明图