groupby
方法是pandas中的分組方法,對數(shù)據(jù)框采用groupby
方法后,返回的是DataFrameGroupBy
對象,一般分組操作后會進行聚合操作。
import pandas as pd import numpy as np pd.set_option('display.notebook_repr_html',False) # 數(shù)據(jù)準備 df = pd.DataFrame({'A': [1, 1, 2, 2],'B': [1, 2, 3, 4],'C':[6,8,1,9]}) df
A B C 0 1 1 6 1 1 2 8 2 2 3 1 3 2 4 9
對數(shù)據(jù)框按A
列進行分組,產(chǎn)生分組數(shù)據(jù)框。分組數(shù)據(jù)框是可迭代對象,可以進行循環(huán)遍歷,可以看出在循環(huán)中,每個元素的類型是元組,
元組的第一個元素是分組值,第二個元素是對應的分組數(shù)據(jù)框。
# 分組 g_df=df.groupby('A') # 分組數(shù)據(jù)框類 type(g_df)
pandas.core.groupby.generic.DataFrameGroupBy
# 循環(huán)分組數(shù)據(jù) for i in g_df: print(i,type(i),end='\n\n')
(1, A B C 0 1 1 6 1 1 2 8) class 'tuple'>
(2, A B C 2 2 3 1 3 2 4 9) class 'tuple'>
可以對分組后的數(shù)據(jù)框直接使用聚合方法agg
,對分組數(shù)據(jù)框的每一列計算統(tǒng)計函數(shù)值。
# 分組求和 df.groupby('A').agg('sum') B C A 1 3 14 2 7 10
可以根據(jù)數(shù)據(jù)框外的序列數(shù)據(jù)對數(shù)據(jù)框進行分組,需要注意序列長度需要與數(shù)據(jù)框行數(shù)相同。
# 定義分組列表 label=['a','a','b','b'] # 分組求和 df.groupby(label).agg('sum') A B C a 2 3 14 b 4 7 10
可以根據(jù)數(shù)據(jù)框的多列對數(shù)據(jù)框進行分組。
# 數(shù)據(jù)準備 df = pd.DataFrame({'A': [1, 1, 2, 2],'B': [3, 4, 3, 3],'C':[6,8,1,9]}) df
A B C 0 1 3 6 1 1 4 8 2 2 3 1 3 2 3 9
根據(jù)A
,B
列進行分組,然后求和。
# 根據(jù)多列分組求和 df.groupby(['A','B']).agg('sum')
C A B 1 3 6 4 8 2 3 10
可以根據(jù)索引對數(shù)據(jù)框進行分組,需要設置level參數(shù)。
# 數(shù)據(jù)準備 df = pd.DataFrame({'A': [1, 1, 2, 2],'B': [3, 4, 3, 3],'C':[6,8,1,9]},index=['a','a','b','b']) df
A B C a 1 3 6 a 1 4 8 b 2 3 1 b 2 3 9
數(shù)據(jù)框只有一層索引,設置參數(shù)level=0
。
# 根據(jù)索引分組求和 df.groupby(level=0).agg('sum') A B C a 2 7 14 b 4 6 10
當數(shù)據(jù)框索引有多層時,也可以根據(jù)需求設置level參數(shù),完成分組聚合。
# 數(shù)據(jù)準備 mi=pd.MultiIndex.from_arrays([[1,1,2,2],[3,4,3,3]],names=['id1','id2']) df=pd.DataFrame(dict(value=[4,7,2,9]),index=mi) df
value id1 id2 1 3 4 4 7 2 3 2 3 9
設置level
參數(shù),如需要根據(jù)第一層索引,即id1進行分組,可以設置level=0
或level='id1'
完成分組聚合。
# 根據(jù)第一層索引分組求和 df.groupby(level=0).agg('sum')
value id1 1 11 2 11
# 根據(jù)第一層索引分組求和 df.groupby(level='id1').agg('sum')
value id1 1 11 2 11
分組后一般會進行聚合操作,用agg
方法進行聚合。
# 數(shù)據(jù)準備 df = pd.DataFrame({'A': [1, 1, 2, 2],'B': [3, 4, 3, 3],'C':[6,8,1,9],'D':[2,5,4,8]}) df
A B C D 0 1 3 6 2 1 1 4 8 5 2 2 3 1 4 3 2 3 9 8
對分組后數(shù)據(jù)框使用單個函數(shù)進行聚合,單個聚合函數(shù)會對每列進行計算,然后合并返回。聚合函數(shù)以字符串的形式傳入。
# 對所有列分組求和 df.groupby('A').agg('sum')
B C D A 1 7 14 7 2 6 10 12
可以對分組后的數(shù)據(jù)指定列進行分組聚合。需要注意子列需要用[]包裹
。
# 對指定列分組求和 df.groupby('A')[['B','C']].agg('sum')
B C A 1 7 14 2 6 10
聚合函數(shù)也可以傳入自定義的匿名函數(shù)。
# 匿名函數(shù)分組求和 df.groupby('A').agg(lambda x:sum(x))
B C D A 1 7 14 7 2 6 10 12
聚合函數(shù)可以是多個函數(shù)。聚合時,多個聚合函數(shù)會對每列進行計算,然后合并返回。聚合函數(shù)以列表的形式傳入。
# 全部列多函數(shù)聚合 df.groupby('A').agg(['sum','mean'])
B C D sum mean sum mean sum mean A 1 7 3.5 14 7 7 3.5 2 6 3.0 10 5 12 6.0
聚合返回后的數(shù)據(jù)列名有兩層索引,第一層是聚合的列名,第二層是使用的聚合函數(shù)名。如果需要對返回的聚合函數(shù)名重命名,
需要在傳參時,傳入元組,第一個元素為聚合函數(shù)名,第二個元素為聚合函數(shù)。
# 聚合函數(shù)重命名 df.groupby('A').agg([('SUM','sum'),('MEAN','mean')])
B C D SUM MEAN SUM MEAN SUM MEAN A 1 7 3.5 14 7 7 3.5 2 6 3.0 10 5 12 6.0
同樣,也可以傳入匿名函數(shù)。
# 匿名函數(shù)并重命名 df.groupby('A').agg([('SUM','sum'),('MAX',lambda x:max(x))])
B C D SUM MAX SUM MAX SUM MAX A 1 7 4 14 8 7 5 2 6 3 10 9 12 8
如果需要對不同的列進行不同的聚合計算,則需要傳入字典的形式。
# 不同列不同聚合函數(shù) df.groupby('A').agg({'B':['sum','mean'],'C':'mean'})
B C sum mean mean A 1 7 3.5 7 2 6 3.0 5
可以重命名聚合后的列名,注意只能對一列傳入一個聚合函數(shù)時有效
。
# 聚合后重命名列名 df.groupby('A').agg(B_sum=('B','sum'),C_mean=('C','mean'))
B_sum C_mean A 1 7 7 2 6 5
到此這篇關于python pandas分組聚合詳細的文章就介紹到這了,更多相關python pandas分組聚合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
標簽:呼倫貝爾 銀川 呼倫貝爾 湘西 安慶 葫蘆島 烏魯木齊 三亞
巨人網(wǎng)絡通訊聲明:本文標題《python pandas分組聚合詳細》,本文關鍵詞 python,pandas,分組,聚合,詳細,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關。