今天來介紹pandas中一個很有用的函數groupby,其實和hive中的groupby的效果是一樣的,區別在于兩種語言的寫法問題。groupby在Python中的分組統計中很有用~
groupby:
首先創建數據:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import pandas as pd import numpy as np df = pd.DataFrame({ 'A' : [ 'a' , 'b' , 'a' , 'c' , 'a' , 'c' , 'b' , 'c' ], 'B' : [ 2 , 7 , 1 , 3 , 3 , 2 , 4 , 8 ], 'C' : [ 100 , 87 , 96 , 130 , 105 , 87 , 96 , 155 ]}) df Out[ 2 ]: A B C 0 a 2 100 1 b 7 87 2 a 1 96 3 c 3 130 4 a 3 105 5 c 2 87 6 b 4 96 |
pandas中groupby的基本操作:
1、按A列進行分組,求B、C兩列的均值:
1
2
3
4
5
6
7
|
df.groupby( 'A' ).mean() Out[ 6 ]: B C A a 2.000000 100.333333 b 5.500000 91.500000 c 4.333333 124.000000 |
當然也可以按照多列進行分組,獲取其他列的均值:
1
2
3
4
5
6
7
8
9
10
11
12
|
df.groupby([ 'A' , 'B' ]).mean() Out[ 7 ]: C A B a 1 96 2 100 3 105 b 4 96 7 87 c 2 87 3 130 8 155 |
2、分組后,選擇列進行計算:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
data = df.groupby( 'A' ) data[ 'B' ].std() Out[ 11 ]: A a 1.00000 b 2.12132 c 3.21455 Name: B, dtype: float64 #選擇B、C兩列 data[ 'B' , 'C' ].mean() Out[ 12 ]: B C A a 2.000000 100.333333 b 5.500000 91.500000 c 4.333333 124.000000 |
3、按A進行分組后,可以對不同的列采用不同的聚合方法(ps:這一點就和hive很相像了)
1
2
3
4
5
6
7
|
data.agg({ 'B' : 'mean' , 'C' : 'sum' }) #B列均值,C列匯總 Out[ 14 ]: C B A a 301 2.000000 b 183 5.500000 c 372 4.333333 |
4、如果按照A進行分組后,對多列采用相同的聚合方法,我們可以借助apply函數:
1
2
3
4
5
6
7
|
df.groupby( 'A' ). apply (np.mean) Out[ 25 ]: B C A a 2.000000 100.333333 b 5.500000 91.500000 c 4.333333 124.000000 |
5、將某列數據按數據值分成不同范圍段進行分組運算
創建數據集:
1
2
3
4
5
6
7
8
9
10
11
|
np.random.seed( 0 ) df = pd.DataFrame({ 'Age' : np.random.randint( 20 , 70 , 100 ), 'Sex' : np.random.choice([ 'Male' , 'Female' ], 100 ), 'number_of_foo' : np.random.randint( 1 , 20 , 100 )}) Out[ 38 ]: Age Sex number_of_foo 0 64 Female 14 1 67 Female 14 2 20 Female 12 3 23 Male 17 4 23 Female 15 |
目標:將age字段分成三組,有如下兩種方法實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#第一種方法: 1 、bins = 4 pd.cut(df[ 'Age' ], bins = 4 ) 0 ( 56.75 , 69.0 ] 1 ( 56.75 , 69.0 ] 2 ( 19.951 , 32.25 ] 3 ( 19.951 , 32.25 ] 4 ( 19.951 , 32.25 ]... #第二種方法 2 、bins = [ 19 , 40 , 65 , np.inf] pd.cut(df[ 'Age' ], bins = [ 19 , 40 , 65 ,np.inf]) Out[ 40 ]: 0 ( 40.0 , 65.0 ] 1 ( 65.0 , inf] 2 ( 19.0 , 40.0 ] 3 ( 19.0 , 40.0 ] 4 ( 19.0 , 40.0 ] #分組范圍結果如下: age_groups = pd.cut(df[ 'Age' ], bins = [ 19 , 40 , 65 ,np.inf]) df.groupby(age_groups).mean() Out[ 43 ]: Age number_of_foo Age ( 19.0 , 40.0 ] 29.840000 9.880000 ( 40.0 , 65.0 ] 52.833333 9.452381 ( 65.0 , inf] 67.375000 9.250000 #按‘Age'分組范圍和性別(sex)進行制作交叉表 pd.crosstab(age_groups, df[ 'Sex' ]) Out[ 44 ]: Sex Female Male Age ( 19.0 , 40.0 ] 22 28 ( 40.0 , 65.0 ] 18 24 ( 65.0 , inf] 3 5 |
agg:
1、使用groupby按照某列(A)進行分組后,需要對另外一列采用不同的聚合方法:
1
2
3
4
5
6
7
8
|
df.groupby( 'A' )[ 'B' ].agg({ 'mean' :np.mean, 'std' : np.std}) Out[ 16 ]: std mean A a 1.00000 2.000000 b 2.12132 5.500000 c 3.21455 4.333333 |
2、按照某列進行分組后,對不同的列采用不同的聚合方法:
1
2
3
4
5
6
7
8
9
|
df.groupby( 'A' ).agg({ 'B' :[np.mean, 'sum' ], 'C' :[ 'count' ,np.std]}) #[]中對應的是兩種方法 Out[ 17 ]: C B count std mean sum A a 3 4.509250 2.000000 6 b 2 6.363961 5.500000 11 c 3 34.394767 4.333333 13 |
transform:
前面兩種方法得到的結果是以A列值為索引的結果,如果使用沒有進行groupby分組的index的話,該怎么操作呢?此時就要用到transform函數了。transform(func, args, *kwargs) 方法簡化了這個過程,: func 參數應用到所有分組,然后把結果放置到原數組的 index 上:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
df Out[ 31 ]: A B C 0 a 2 100 1 b 7 87 2 a 1 96 3 c 3 130 4 a 3 105 5 c 2 87 6 b 4 96 7 c 8 155 df.groupby( 'A' )[ 'B' , 'C' ].transform( 'count' ) #注:count函數在計算時,不計算nan值 Out[ 32 ]: B C 0 3 3 1 2 2 2 3 3 3 3 3 4 3 3 5 3 3 6 2 2 7 3 3 |
從中可以看出:按A列進行分組,對B、C兩列進行計數時,B為a的索引有[0,2,4],所以結果列的中[0,2,4]索引的值都為3,相當于廣播了。對于C列,同理。
到此這篇關于python中分組函數groupby和分組運算函數agg的使用的文章就介紹到這了,更多相關python 分組函數groupby和分組運算函數agg內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_37536446/article/details/82109431