Pandas詳解十五之利用GroupBy技術進行分組

約定:
import pandas as pd
import numpy as np

GroupBy分組

對數據進行分組並對每個分組進行運算是數據分析中很重要的環節。該博客講解了利用pandas的Groupby技術如何進行分組。下圖簡單介紹了分組的過程:

這裏寫圖片描述

  • 創建DataFrame對象
df1=pd.DataFrame({'Data1':np.random.randint(0,10,5),'Data2':np.random.randint(10,20,5),'key1':list('aabba'),'key2':list('xyyxy')})
df1
代碼結果:
Data1 Data2 key1 key2
0 5 15 a x
1 2 15 a y
2 6 17 b y
3 9 16 b x
4 9 13 a y
  • 分組特性和查看分組後的大小

.groupby()返回的是pandas的groupby對象。gr1並未進行任何計算,但它包括了接下來計算所需的數據。

gr1=df1['Data1'].groupby(df1['key1'])
print(gr1)
gr1.size()

代碼結果:

<pandas.core.groupby.SeriesGroupBy object at 0x00000220D1A1EC88>
key1
a    3
b    2
Name: Data1, dtype: int64
  • 根據單列來對單列分組
df1['Data1'].groupby(df1['key1']).count()

代碼結果:

key1
a    3
b    2
Name: Data1, dtype: int64
  • 根據單列來對多列分組
df1[['Data1','Data2']].groupby(df1['key1']).mean()
代碼結果:
Data1 Data2
key1
a 5.333333 14.333333
b 7.500000 16.500000
  • 根據多列單列分組

注意,下例通過兩列分組得到的是多級索引的Series對象,groupby()裏面分組順序不同而結果不同。

df1['Data1'].groupby([df1['key1'],df1['key2']]).count()

代碼結果:

key1  key2
a     x       1
      y       2
b     x       1
      y       1
Name: Data1, dtype: int64
  • 根據多列多列分組

下例通過兩列分組得到的是多級索引的DataFrame對象。

df1.groupby([df1['key1'],df1['key2']]).sum()
代碼結果:
Data1 Data2
key1 key2
a x 5 15
y 11 28
b x 9 16
y 6 17
  • 除了上述用Series對象作爲分組的依據,還可以是:列表、數組、字符串、字典等等。
#列表
df1['Data1'].groupby([1,2,3,2,1]).count()

代碼結果:

1    2
2    2
3    1
Name: Data1, dtype: int64
#數組
df1['Data1'].groupby(np.array([2,1,2,1,1])).count()

代碼結果:

1    3
2    2
Name: Data1, dtype: int64
#字符串
df1[['Data1','key1']].groupby('key1').count()
代碼結果:
Data1
key1
a 3
b 2
#字典 
df1['Data1'].groupby({0:'y',1:'x',2:'x',3:'y',4:'z'}).count()

代碼結果:

x    2
y    2
z    1
Name: Data1, dtype: int64
  • 麻煩列’被消除

當分組後進行shu數值計算時,不是數值類的列(即麻煩列)會被清除

df1.groupby('key2').mean()
代碼結果:
Data1 Data2
key2
x 7.000000 15.5
y 5.666667 15.0
  • 取分組的一列或某幾列

當數據特別巨大時,而我們只需某幾列,這時這樣的用法是十分省時又方便的。

df1.groupby('key1')['Data1'].max()

代碼結果:

key1
a    9
b    9
Name: Data1, dtype: int32
  • 傳入axis=1橫向分組
df1.groupby([1,1,2,1],axis=1).count()
代碼結果:
1 2
0 3 1
1 3 1
2 3 1
3 3 1
4 3 1
  • 接下來是分組後可運行的簡單運算函數表:
    這裏寫圖片描述

謝謝大家的瀏覽,
希望我的努力能幫助到您,
共勉!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章