Pandas 分组聚合操作

1. 前言

上一节我们学习了 Pandas 对数据的重塑操作,可以满足我们对数据集不同结构的分析需要,而有时候我们还需要对数据依据某个类别进行分组的需要,以及在分组后对每组数据进行分析的需要,那 Pandas 中的数据分组操作又是怎么实现的呢?

Pandas 库中提供了友好的数据分组聚合操作,分组聚合的过程包括数据的拆分、应用和聚合,如下图所示的过程。数据的分组操作主要涉及函数 groupby (),而聚合函数则有很多,在下面的学习中我们会列举一些聚合函数的具体使用方法。

图片描述

2. 分组操作

Pandas 中的分组操作主要通过函数 groupby () 实现,该函数对数据进行分组,并不会产生运算,分组后会返回一个 groupby 对象,该对象并不能展示数据,要通过具体的操作函数才能看到数据结果。

首先我们通过 Pandas 解析 Excel 数据,得到 DataFrame 数据对象:

# 导入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第19小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
   编程语言 技术方向   推出时间  年均销售数量    价格      主要创始人
0  java   后端       1995230       45.6               James Gosling
1  HTML   前端       1990124       55.3          Daniel W. Connolly
2     C   后端       197235       33.9  Dennis MacAlistair Ritchie
3    js   前端       1995678       59.5                Brendan Eich
4   C++   后端       1983125       75.0           Bjarne Stroustrup
5   CSS   前端       1990254       24.6             Tim Berners-Lee

接下来我们进行分组操作:

# data 为上面解析的数据对象
# 这里依据技术方向列进行分组
data.groupby('技术方向')
# --- 输出结果 ---
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001D618583070>
# 结果解析:这里我们使用的是单个索引‘技术方向’进行分组,也可以传入一个列表进行分组。这里可以看到输出的是一个 DataFrameGroupBy 对象

3. 聚合操作

聚合操作是分组的目的,通过聚合操作对各组数据进行聚合,得到一定的分析效果,Pandas 中提供了大量的聚合操作函数,我们下面列举了部分,用以展示数据分组后进行聚合操作的效果。

函数名 说明
count 各分组中非 NaN 值的数量
sum 各分组中非 NaN 值的和
mean 各分组中非 NaN 值的平均值

下面我们通过代码详细介绍聚合函数的使用:

1. sum() 函数

该函数用于求各组数值数据的和,非数值数据不进行该聚合操作。

data.groupby(['技术方向','推出时间']).sum()
# --- 输出结果 ---
                 年均销售数量	价格
技术方向	推出时间		
  前端	 1990378	   79.9
          1995678	59.5
  后端	 197235	   33.9
          1983125	75.0
          1995230	45.6
# 结果解析:这里我们指定分组索引依据为列表,传入‘技术方向’,‘推出时间’,则分组是先以技术方向分为“前端”和“后端”,再以推出时间进行分组,带分组之后,进行 sum() 各组求和的聚合运算,得到各组的年均销售数量和价格的数据结果。

在这里我们要补充一个下 groupby () 函数中的一个参数:as_index ,该参数默认为 True,是用来指定是否用分组索引作为聚合结果数据集的行索引,上面的代码中,默认 as_index=True ,因此行索引会有两层,分别为技术方向和推出时间,下面我们通过指定 as_index=False , 默认行索引会从 0 开始生成序列:

# data 为上面解析的数据对象
# 指定 as_index=False
data.groupby(['技术方向','推出时间'],as_index=False).sum()
# --- 输出结果 ---
  技术方向	推出时间 年均销售数量	价格
0	前端	1990378	   79.9
1	前端	1995678	   59.5
2	后端	197235	   33.9
3	后端	1983125	   75.0
4	后端	1995230	   45.6
# 结果解析:可以看到聚合后的数据集行索引为默认生成。

2. count() 函数

该函数用于计算分组后各组数据的数量。

# data 为上面解析的数据对象
# count() 函数
data.groupby(['技术方向','推出时间'],as_index=False)['编程语言','年均销售数量','价格'].count()
# --- 输出结果 ---
   技术方向	推出时间  编程语言 年均销售数量 价格
0	前端	  19902	    2	    2
1	前端	  19951	    1	    1
2	后端	  19721	    1	    1
3	后端	  19831	    1	    1
4	后端	  19951	    1	    1

结果解析:这里我们通过 count () 进行聚合,并指定只聚合 “编程语言”,“年均销售数量”,“价格” 列的数据数量。

3. mean() 函数

该函数用于进行各分组数据的平均值的计算,该函数只对数值数据进行聚合。

# data 为上面解析的数据对象
# mean() 函数
data.groupby(['技术方向'],as_index=False).mean()
# --- 输出结果 ---
  技术方向	年均销售数量	价格
0	前端	    352	    46.466667
1	后端	    130	    51.500000

结果解析:通过 groupby 指定以技术方向进行分组,分为前端和后端,然后进行平均值的聚合操作。

4. 小结

本节课程我们主要学习了 Pandas 对数据进行分组和聚合操作的内容,通过分组操作可以将数据根据不同的组类进行分组,通过聚合函数可以达到对每组数据的不同分析需要。本节课程的重点如下:

  • 了解分组和聚合之间的关系;
  • 掌握分组操作 groupby () 函数的使用方法;
  • 掌握常用的聚合操作函数的使用方法。

图片描述