首页 > Pandas 阅读数:37

Pandas GroupBy分组函数用法详解

分组统计是一个比较常见的操作,我们需要对不同类别的数据分别观察。比如在一个班级中,我们想要获得男生的最大年龄和女生的最大年龄,这时就需要先按性别进行分组,然后分别统计最大年龄。

起始分组操作也是数据库的常见操作,其实我们可以把 DataFrame 看作是数据库中的一张表。

1. 基本函数

基本函数可以用来查看分组的具体信息。示例代码如下。
In [1]: import pandas as pd
   ...: import numpy as np
In [2]: df = pd.DataFrame({'性别' : ['男', '女', '男', '女',
   ...:                             '男', '女', '男', '男'],
   ...:                        '成绩' : ['98', '93', '70', '56',
   ...:                                 '67', '64', '89', '87'],
   ...:                        '年龄' : [15,14,15,12,13,14,15,16]})
   ...: df
Out[2]: 
  性别  成绩  年龄
0  男   98   15
1  女   93   14
2  男   70   15
3  女   56   12
4  男   67   13
5  女   64   14
6  男   89   15
7  男   87   16 

1) 创建分组对象

这里我们根据性别字段进行分组,创建 GroupBy 对象,男生一组,女生一组。
In [3]: GroupBy=df.groupby("性别")
In [4]: for name,group in GroupBy:  # 查看分组的具体信息
   ...:      print(name)
   ...:      print(group)
女
  性别  成绩  年龄
1  女   93   14
3  女   56   12
5  女   64   14
男
  性别  成绩  年龄
0  男   98   15
2  男   70   15
4  男   67   13
6  男   89   15
7  男   87   16

2) 查看分组信息

groups 属性可以用来查看分组的信息,从返回的结果中可以看到不同分组的样本在原数据框中的索引。
In [5]: GroupBy.groups  # 显示分组的组名,以及所对应的索引
Out[5]: 
{'女': Int64Index([1, 3, 5], dtype='int64'),
'男': Int64Index([0, 2, 4, 6, 7], dtype='int64')}
In [6]: GroupBy.indices  # 类似于GroupBy.groups
Out[6]: {' 女 ': array([1, 3, 5], dtype=int64), ' 男': array([0, 2, 4, 6, 7], dtype=int64)}

3) get_group()获得指定分组

get_group 方法可以用来获得指定分组的数据框。
In [7]: GroupBy.get_group("男")  # 获得指定分组
Out[7]: 
  性别  成绩  年龄
0  男   98   15
2  男   70   15
4  男   67   13
6  男   89   15
7  男   87   16

4)查看分组头尾元素

head 方法和 tail 方法可以用来获得分组后每个组头尾的若干元素。
In [8]: GroupBy.head(2)  # 每个组头两个元素
Out[8]: 
  性别  成绩  年龄
0  男   98   15
1  女   93   14
2  男   70   15
3  女   56   12
In [9]: GroupBy.tail(2)  # 每个组末尾两个元素
Out[9]: 
  性别  成绩  年龄
3  女   56   12
5  女   64   14
6  男   89   15
7  男   87   16

5) 获取每个组若干元素

nth 方法可以用来获得每个分组的若干元素。
In [10]: GroupBy.nth(1)  # 查看每个分组若干元素
Out[10]: 
性别  年龄  成绩
女    12   56
男    15   70

2. 统计函数

分组最主要的作用就是对各个组别进行分组描述。分组返回的是对各个组别统计的结果。

1) count()

Count 方法用来计算每个分组样本的个数。
In [11]: GroupBy.count()  # 查看分组后元素个数
Out[11]: 
性别  成绩  年龄
女     3    3
男     5    5

2) max()

max 方法用来计算分组后,每个组的最大值。
In [12]: GroupBy.max()  # 每个组的最大值
Out[12]: 
性别  成绩  年龄
女    93   14
男    98   16

3) min()

min 方法用来计算分组后,每个组的最小值。
In [13]: GroupBy.min()  # 每个组的最小值
Out[13]: 
性别  成绩  年龄
女    56   12
男    67   13

4) media()

median 方法用来计算分组后,每个组的中位数。
In [14]: GroupBy.median()  # 每个组的中位数
Out[14]: 
性别  年龄
女    14
男    15

5) sun()

sum 方法用来计算分组后,每个组的和。
In [15]: GroupBy.sum()  # 查看组的和
Out[15]: 
性别  年龄
女    40
男    74

6) prod()

prod 方法用来计算分组后,每个组的乘积。
In [16]: GroupBy.prod()  # 每个组的乘积
Out[16]: 
性别    年龄
女     2352
男    702000

7) std()

std 方法用来计算分组后,每个组的标准差。
In [17]: GroupBy.std()  # 每个组的标准差
Out[17]: 
性别     年龄
女    1.154701
男    1.095445

8) var()

var 方法用来计算分组后,每个组的方差。
In [18]: GroupBy.var()  # 每个组的方差
Out[18]: 
性别      年龄
女     1.333333
男     1.200000 

9) agg()

agg 方法可以用来分别计算分组后每个组的和、均值和标准差。
In [19]: GroupBy['年龄'].agg([np.sum, np.mean, np.std])# 同时查看每个组的和、均值和
#标准差
Out[19]: 
性别  sum       mean       std
女    40     13.333333   1.154701
男    74     14.800000   1.095445