Python Pandas中groupby与agg函数的分组统计实战指南

慢慢来
慢慢来
发布时间:2026-10-14 | 4人浏览过
原创

本文详细介绍Python Pandas库中groupby分组函数与agg聚合函数的使用方法。通过具体代码示例,演示如何按单列或多列进行分组统计,包括计算均值、标准差及自定义聚合。同时讲解如何利用transform保持原始索引结构,以及如何利用cut进行数据分箱分组,帮助开发者高效处理复杂数据分析任务。

今天我们来深入探讨Pandas库中一个极其重要的函数:groupby。它的功能逻辑与Hive中的groupby类似,主要区别在于语法实现方式不同。在Python的数据处理流程中,groupby是实现高效分组统计的核心工具。

groupby基础用法

为了演示操作,我们首先构建一个示例数据集。


import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'], 
                       'B': [2, 7, 1, 3, 3, 2, 4, 8], 
                       'C': [100, 87, 96, 130, 105, 87, 96, 155]})
df
Out[2]: 
   A  B    C
0  a  2  100
1  b  7   87
2  a  1   96
3  c  3  130
4  a  3  105
5  c  2   87
6  b  4   96

接下来展示Pandas中groupby的基本操作流程。

第一步,按A列进行分组,并计算B列和C列的平均值。


df.groupby('A').mean()
Out[6]: 
          B           C
A                      
a  2.000000  100.333333
b  5.500000   91.500000
c  4.333333  124.000000

此外,还可以基于多列组合进行分组,进而获取其他数值列的均值。


df.groupby(['A','B']).mean()
Out[7]: 
       C
A B     
a 1   96
  2  100
  3  105
b 4   96
  7   87
c 2   87
  3  130
  8  155

第二步,在分组完成后,可以选择特定的列进行后续计算。


data=df.groupby('A')
data['B'].std()
Out[11]: 
A
a    1.00000
b    2.12132
c    3.21455
Name: B, dtype: float64
 
#选择B、C两列
data['B','C'].mean()
Out[12]: 
          B           C
A                      
a  2.000000  100.333333
b  5.500000   91.500000
c  4.333333  124.000000

第三步,按A列分组后,允许对不同列应用不同的聚合函数(这一点与Hive的特性非常相似)。


data.agg({'B':'mean','C':'sum'})    #B列均值,C列汇总
Out[14]: 
     C         B
A               
a  301  2.000000
b  183  5.500000
c  372  4.333333

第四步,若按A列分组后需对多列应用相同的聚合逻辑,可以借助apply函数来实现。


df.groupby('A').apply(np.mean)
Out[25]: 
          B           C
A                      
a  2.000000  100.333333
b  5.500000   91.500000
c  4.333333  124.000000

第五步,将某列数据根据数值范围划分为不同区间,并进行分组运算。

首先创建包含年龄、性别等字段的数据集。


np.random.seed(0)
df = pd.DataFrame({'Age': np.random.randint(20, 70, 100), 
                        'Sex': np.random.choice(['Male', 'Female'], 100), 
                        'number_of_foo': np.random.randint(1, 20, 100)})
Out[38]: 
   Age     Sex  number_of_foo
0   64  Female             14
1   67  Female             14
2   20  Female             12
3   23    Male             17
4   23  Female             15

目标是将age字段划分为三个区间,实现该目标有两种常用方法。


#第一种方法:
1、bins=4
pd.cut(df['Age'], bins=4)
0       (56.75, 69.0]
1       (56.75, 69.0]
2     (19.951, 32.25]
3     (19.951, 32.25]
4     (19.951, 32.25]...
 
#第二种方法
2、bins=[19, 40, 65, np.inf]
pd.cut(df['Age'], bins=[19,40,65,np.inf])
Out[40]: 
0     (40.0, 65.0]
1      (65.0, inf]
2     (19.0, 40.0]
3     (19.0, 40.0]
4     (19.0, 40.0]
 
#分组范围结果如下:
age_groups = pd.cut(df['Age'], bins=[19,40,65,np.inf])
df.groupby(age_groups).mean()
Out[43]: 
                    Age  number_of_foo
Age                                   
(19.0, 40.0]  29.840000       9.880000
(40.0, 65.0]  52.833333       9.452381
(65.0, inf]   67.375000       9.250000
 
#按‘Age'分组范围和性别(sex)进行制作交叉表
 
pd.crosstab(age_groups, df['Sex'])
Out[44]: 
Sex           Female  Male
Age                       
(19.0, 40.0]      22    28
(40.0, 65.0]      18    24
(65.0, inf]        3     5

agg聚合函数详解

第一种场景:使用groupby按某列(如A)分组后,对另一列应用多种不同的聚合方法。


df.groupby('A')['B'].agg({'mean':np.mean, 'std': np.std})
 
Out[16]: 
       std      mean
A                   
a  1.00000  2.000000
b  2.12132  5.500000
c  3.21455  4.333333

第二种场景:按某列分组后,对不同列分别指定不同的聚合函数。


df.groupby('A').agg({'B':[np.mean,'sum'],'C':['count',np.std]})  #[]中对应的是两种方法
 
Out[17]: 
      C                    B    
  count        std      mean sum
A                               
a     3   4.509250  2.000000   6
b     2   6.363961  5.500000  11
c     3  34.394767  4.333333  13

transform转换函数

前两种方法生成的结果以分组列(A)为索引。如果希望结果保留原始未分组的index,应使用transform函数。transform(func, args, *kwargs)简化了这一过程:它将func参数应用于所有分组,并将结果广播回原数组的index上。


df
Out[31]: 
   A  B    C
0  a  2  100
1  b  7   87
2  a  1   96
3  c  3  130
4  a  3  105
5  c  2   87
6  b  4   96
7  c  8  155
 
df.groupby('A')['B','C'].transform('count')  #注:count函数在计算时,不计算nan值
Out[32]: 
   B  C
0  3  3
1  2  2
2  3  3
3  3  3
4  3  3
5  3  3
6  2  2
7  3  3

从输出结果可以看出:按A列分组并对B、C列计数时,B列中索引为[0,2,4]的记录属于组'a',因此结果列中对应[0,2,4]索引的值均为3,这体现了广播机制。C列同理。

至此,关于Python中分组函数groupby和分组运算函数agg的使用介绍完毕。如需了解更多相关内容,可查阅本站过往文章或继续浏览后续教程,感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表