DataFrame数据聚合与分组

发布时间:2026/7/15 20:01:38
DataFrame数据聚合与分组 前言在数据分析工作中原始数据往往杂乱分散我们经常需要按照某一类维度对数据进行划分再对各组数据进行统计运算这一整套流程就是分组 聚合。Pandas 中 DataFrame 提供了强大的分组聚合 API熟练掌握groupby、聚合函数、转换、筛选分组数据是开展探索性数据分析EDA的基础技能。本文基于 Pandas 讲解 DataFrame 分组与聚合常用用法附带可直接运行代码示例。一、核心概念理解分组 groupby按照指定一列/多列的相同值把整张 DataFrame 切分成若干个子数据集聚合 aggregate对每个分组内的数据执行汇总计算求和、均值、计数、最大最小值等执行流程通俗概括拆分 → 应用函数 → 合并结果Split拆分→ Apply运算→ Combine合并二、准备测试数据先构造示例数据集后续所有示例统一使用importpandasaspd data{部门:[技术部,运营部,技术部,市场部,运营部,市场部,技术部],员工:[张三,李四,王五,赵六,钱七,孙八,周九],薪资:[18000,12000,22000,15000,11000,14000,20000],工龄:[3,2,5,2,1,4,4]}dfpd.DataFrame(data)print(df)三、基础分组 groupby 使用3.1 单列分组df.groupby(分组字段)不会立刻执行计算返回的是分组对象DataFrameGroupBy属于惰性计算。# 按照【部门】分组group_objdf.groupby(部门)# 查看分组名称print(group_obj.groups.keys())3.2 多列联合分组同时依据多个维度分组传入列表# 先按部门分组再按工龄分组group_multidf.groupby([部门,工龄])3.3 获取指定分组数据使用get_group()提取某一分组完整数据tech_dfdf.groupby(部门).get_group(技术部)print(tech_df)四、数据聚合操作4.1 内置简单聚合函数groupby 对象支持直接调用统计方法sum()求和mean()平均值count()非空计数max()/min()最大、最小值std()标准差# 按部门分组计算薪资平均值resdf.groupby(部门)[薪资].mean()print(res)# 多列同时聚合res2df.groupby(部门)[[薪资,工龄]].sum()print(res2)4.2 aggregate() / agg() 多函数聚合agg()是最灵活的聚合方法可以一次性使用多个统计函数# 对薪资同时计算均值、总和、人数resdf.groupby(部门)[薪资].agg([mean,sum,count])print(res)不同字段使用不同聚合函数resdf.groupby(部门).agg(平均薪资(薪资,mean),最高薪资(薪资,max),平均工龄(工龄,mean))print(res)推荐写法支持直接自定义结果列名避免后续重复重命名。4.3 自定义聚合函数除内置函数支持传入自定义函数完成特殊统计defrange_salary(x):# 计算薪资极差最大值-最小值returnx.max()-x.min()resdf.groupby(部门)[薪资].agg(range_salary)print(res)五、transform 分组转换重点难点普通聚合会缩减行数一组返回一行结果transform()保持原始 DataFrame 行数不变将分组计算结果广播填充到每组所有行。典型场景计算每个员工薪资与所在部门平均薪资差值# 部门平均薪资广播到每行df[部门平均薪资]df.groupby(部门)[薪资].transform(mean)df[薪资与均值差]df[薪资]-df[部门平均薪资]print(df)适用场景组内归一化、组内差值对比、批量填充组内缺失值。六、filter 分组筛选对整个分组进行条件过滤保留满足条件的全部分组数据。区别布尔索引filter 筛选分组不是筛选单行。示例只保留员工人数≥3人的部门全部数据# x 代表每个分组的子DataFrameresdf.groupby(部门).filter(lambdax:len(x)3)print(res)七、分组结果索引处理groupby 默认会将分组字段设为行索引日常分析中经常需要转为普通列resdf.groupby(部门)[薪资].mean().reset_index()print(res)reset_index()是高频操作方便后续绘图、导出Excel、SQL风格处理。八、sort 分组排序控制关闭分组自动排序groupby 默认会对分组键排序数据量大时存在性能损耗可以关闭df.groupby(部门,sortFalse)[薪资].mean()聚合后排序resdf.groupby(部门)[薪资].mean().reset_index()resres.sort_values(薪资,ascendingFalse)九、常见踩坑总结分组后直接使用 df[“列名”] 减少计算范围优先指定需要聚合的列groupby()[[A,B]]避免对全列运算提升性能区分 agg / transform / filteragg一组输出一行汇总报表transform行数不变组内广播行级别对比filter按分组整体条件过滤数据集多列分组结果为多层索引记得适时使用 reset_index()缺失值groupby 默认会剔除分组键为空值的行如需保留空值分组需要额外处理。十、综合实战案例需求统计各部门信息平均薪资、总人数、薪资极差筛选平均薪资大于14000的部门df_resdf.groupby(部门).agg(员工数量(员工,count),平均薪资(薪资,mean),薪资极差(薪资,range_salary)).reset_index()# 筛选df_finaldf_res[df_res[平均薪资]14000]print(df_final)结语DataFrame 分组与聚合是 Pandas 数据分析的核心能力。简单统计使用内置聚合函数多指标、多字段差异化计算优先使用agg()需要保留原始行数做组内对比选用transform需要按分组整体过滤数据使用filter。掌握这套工具链绝大多数数据透视、维度汇总、报表统计需求都可以快速实现。