GroupBy技術是對於數據進行分組計算並將各組計算結果合並的一項技術,包括以下3個過程:
- 拆分(Spliting):即將數據進行分組
- 應用(Applying):對每組應用函數進行計算
- 合並(Combining):將計算結果進行數據聚合

使用GroupBy()可以沿着任意軸進行分組,並且將分組依據的鍵作為每組的組名,有一下3種用法:
- df.groupby(key)
- df.groupby(key,axis=1)
- df.groupby([key1,key2])
注:key需要用""引起來
其中的參數axis,可設置是橫向分組還是縱向分組,默認是橫向分組(axis=0),也是比較常用的。
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.read_excel('./input/class.xlsx')
>>> df
class sex score_math score_music
0 A male 95 79
1 A female 96 90
2 B female 85 85
3 C male 93 92
4 B female 84 90
5 B male 88 70
6 C male 59 89
7 A male 88 86
8 B male 89 74
#使用groupby()按照class進行分組,返回的結果是一個GroupBY對象,即拆分過程
>>> df.groupby('class')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000024D18D73DA0>
分組時所依據的鍵的唯一值作為索引,且當傳入多個值時將產生層次化索引
>>> df.groupby('class').sum()
score_math score_music
class
A 279 255
B 346 319
C 152 181
>>> df.groupby(['class','sex']).mean()
score_math score_music
class sex
A female 96.0 90.0
male 91.5 82.5
B female 84.5 87.5
male 88.5 72.0
C male 76.0 90.5
在分組時除了傳入列表,也可傳入一個對於對象行或列長度一致的數組。(並不常用)
例:求按性別分組的各課程平均分,傳入性別使用中文表示的一個數組
>>> arr = np.array(['男','女','女','男','女','男','男','男','男']) >>> df.groupby(arr).mean() score_math score_music 女 88.333333 88.333333 男 85.333333 81.666667
.count()函數可統計各組樣本數量,.idxmax()函數可返回最大值的索引
#按照class和sex分組后各組樣本的數量
>>> df.groupby(['class','sex']).count()
score_math score_music
class sex
A female 1 1
male 2 2
B female 2 2
male 2 2
C male 2 2
##按照class和sex分組后最大值的索引
>>> df.groupby(['class','sex']).idxmax()
score_math score_music
class sex
A female 1 1
male 0 7
B female 2 4
male 8 8
C male 3 3
>>> df.groupby(['class','sex']).count().idxmax()
score_math (A, male)
score_music (A, male)
dtype: object
#按照class和sex分組后樣本數量最多的索引
>>> df.groupby(['class','sex']).count().idxmax()[0]
('A', 'male')
