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 |
- 接下來是分組後可運行的簡單運算函數表:
謝謝大家的瀏覽,
希望我的努力能幫助到您,
共勉!