您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么使用python中分組函數groupby和分組運算函數agg”,在日常操作中,相信很多人在怎么使用python中分組函數groupby和分組運算函數agg問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用python中分組函數groupby和分組運算函數agg”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
首先創建數據:
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兩列的均值:
df.groupby('A').mean() Out[6]: B C A a 2.000000 100.333333 b 5.500000 91.500000 c 4.333333 124.000000
當然也可以按照多列進行分組,獲取其他列的均值:
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、分組后,選擇列進行計算:
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很相像了)
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函數:
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、將某列數據按數據值分成不同范圍段進行分組運算
創建數據集:
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、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
1、使用groupby按照某列(A)進行分組后,需要對另外一列采用不同的聚合方法:
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、按照某列進行分組后,對不同的列采用不同的聚合方法:
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 上:
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”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。