Pandas 分組聚合操作
1. 前言
上一節(jié)我們學習了 Pandas 對數(shù)據(jù)的重塑操作,可以滿足我們對數(shù)據(jù)集不同結構的分析需要,而有時候我們還需要對數(shù)據(jù)依據(jù)某個類別進行分組的需要,以及在分組后對每組數(shù)據(jù)進行分析的需要,那 Pandas 中的數(shù)據(jù)分組操作又是怎么實現(xiàn)的呢?
Pandas 庫中提供了友好的數(shù)據(jù)分組聚合操作,分組聚合的過程包括數(shù)據(jù)的拆分、應用和聚合,如下圖所示的過程。數(shù)據(jù)的分組操作主要涉及函數(shù) groupby (),而聚合函數(shù)則有很多,在下面的學習中我們會列舉一些聚合函數(shù)的具體使用方法。
2. 分組操作
Pandas 中的分組操作主要通過函數(shù) groupby () 實現(xiàn),該函數(shù)對數(shù)據(jù)進行分組,并不會產(chǎn)生運算,分組后會返回一個 groupby 對象,該對象并不能展示數(shù)據(jù),要通過具體的操作函數(shù)才能看到數(shù)據(jù)結果。
首先我們通過 Pandas 解析 Excel 數(shù)據(jù),得到 DataFrame 數(shù)據(jù)對象:
# 導入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第19小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結果 ---
編程語言 技術方向 推出時間 年均銷售數(shù)量 價格 主要創(chuàng)始人
0 java 后端 1995年 230 45.6 James Gosling
1 HTML 前端 1990年 124 55.3 Daniel W. Connolly
2 C 后端 1972年 35 33.9 Dennis MacAlistair Ritchie
3 js 前端 1995年 678 59.5 Brendan Eich
4 C++ 后端 1983年 125 75.0 Bjarne Stroustrup
5 CSS 前端 1990年 254 24.6 Tim Berners-Lee
接下來我們進行分組操作:
# data 為上面解析的數(shù)據(jù)對象
# 這里依據(jù)技術方向列進行分組
data.groupby('技術方向')
# --- 輸出結果 ---
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001D618583070>
# 結果解析:這里我們使用的是單個索引‘技術方向’進行分組,也可以傳入一個列表進行分組。這里可以看到輸出的是一個 DataFrameGroupBy 對象
3. 聚合操作
聚合操作是分組的目的,通過聚合操作對各組數(shù)據(jù)進行聚合,得到一定的分析效果,Pandas 中提供了大量的聚合操作函數(shù),我們下面列舉了部分,用以展示數(shù)據(jù)分組后進行聚合操作的效果。
函數(shù)名 | 說明 |
---|---|
count | 各分組中非 NaN 值的數(shù)量 |
sum | 各分組中非 NaN 值的和 |
mean | 各分組中非 NaN 值的平均值 |
下面我們通過代碼詳細介紹聚合函數(shù)的使用:
1. sum() 函數(shù)
該函數(shù)用于求各組數(shù)值數(shù)據(jù)的和,非數(shù)值數(shù)據(jù)不進行該聚合操作。
data.groupby(['技術方向','推出時間']).sum()
# --- 輸出結果 ---
年均銷售數(shù)量 價格
技術方向 推出時間
前端 1990年 378 79.9
1995年 678 59.5
后端 1972年 35 33.9
1983年 125 75.0
1995年 230 45.6
# 結果解析:這里我們指定分組索引依據(jù)為列表,傳入‘技術方向’,‘推出時間’,則分組是先以技術方向分為“前端”和“后端”,再以推出時間進行分組,帶分組之后,進行 sum() 各組求和的聚合運算,得到各組的年均銷售數(shù)量和價格的數(shù)據(jù)結果。
在這里我們要補充一個下 groupby () 函數(shù)中的一個參數(shù):as_index ,該參數(shù)默認為 True,是用來指定是否用分組索引作為聚合結果數(shù)據(jù)集的行索引,上面的代碼中,默認 as_index=True ,因此行索引會有兩層,分別為技術方向和推出時間,下面我們通過指定 as_index=False , 默認行索引會從 0 開始生成序列:
# data 為上面解析的數(shù)據(jù)對象
# 指定 as_index=False
data.groupby(['技術方向','推出時間'],as_index=False).sum()
# --- 輸出結果 ---
技術方向 推出時間 年均銷售數(shù)量 價格
0 前端 1990年 378 79.9
1 前端 1995年 678 59.5
2 后端 1972年 35 33.9
3 后端 1983年 125 75.0
4 后端 1995年 230 45.6
# 結果解析:可以看到聚合后的數(shù)據(jù)集行索引為默認生成。
2. count() 函數(shù)
該函數(shù)用于計算分組后各組數(shù)據(jù)的數(shù)量。
# data 為上面解析的數(shù)據(jù)對象
# count() 函數(shù)
data.groupby(['技術方向','推出時間'],as_index=False)['編程語言','年均銷售數(shù)量','價格'].count()
# --- 輸出結果 ---
技術方向 推出時間 編程語言 年均銷售數(shù)量 價格
0 前端 1990年 2 2 2
1 前端 1995年 1 1 1
2 后端 1972年 1 1 1
3 后端 1983年 1 1 1
4 后端 1995年 1 1 1
結果解析:這里我們通過 count () 進行聚合,并指定只聚合 “編程語言”,“年均銷售數(shù)量”,“價格” 列的數(shù)據(jù)數(shù)量。
3. mean() 函數(shù)
該函數(shù)用于進行各分組數(shù)據(jù)的平均值的計算,該函數(shù)只對數(shù)值數(shù)據(jù)進行聚合。
# data 為上面解析的數(shù)據(jù)對象
# mean() 函數(shù)
data.groupby(['技術方向'],as_index=False).mean()
# --- 輸出結果 ---
技術方向 年均銷售數(shù)量 價格
0 前端 352 46.466667
1 后端 130 51.500000
結果解析:通過 groupby 指定以技術方向進行分組,分為前端和后端,然后進行平均值的聚合操作。
4. 小結
本節(jié)課程我們主要學習了 Pandas 對數(shù)據(jù)進行分組和聚合操作的內容,通過分組操作可以將數(shù)據(jù)根據(jù)不同的組類進行分組,通過聚合函數(shù)可以達到對每組數(shù)據(jù)的不同分析需要。本節(jié)課程的重點如下:
- 了解分組和聚合之間的關系;
- 掌握分組操作 groupby () 函數(shù)的使用方法;
- 掌握常用的聚合操作函數(shù)的使用方法。