python--pandas分組聚合

分組聚合是數(shù)據(jù)處理中常見(jiàn)的場(chǎng)景硝桩,在pandas中用groupby方法實(shí)現(xiàn)分組操作,用agg方法實(shí)現(xiàn)聚合操作索烹。

環(huán)境

  • python3.9
  • win10 64bit
  • pandas==1.2.1

groupby方法是pandas中的分組方法届案,對(duì)數(shù)據(jù)框采用groupby方法后,返回的是DataFrameGroupBy對(duì)象啦逆,一般分組操作后會(huì)進(jìn)行聚合操作伞矩。

分組

import pandas as pd
import numpy as np
pd.set_option('display.notebook_repr_html',False)
# 數(shù)據(jù)準(zhǔn)備
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

對(duì)數(shù)據(jù)框按A列進(jìn)行分組,產(chǎn)生分組數(shù)據(jù)框夏志。分組數(shù)據(jù)框是可迭代對(duì)象乃坤,可以進(jìn)行循環(huán)遍歷,可以看出在循環(huán)中,每個(gè)元素的類型是元組侥袜,
元組的第一個(gè)元素是分組值蝌诡,第二個(gè)元素是對(duì)應(yīng)的分組數(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'>

可以對(duì)分組后的數(shù)據(jù)框直接使用聚合方法agg枫吧,對(duì)分組數(shù)據(jù)框的每一列計(jì)算統(tǒng)計(jì)函數(shù)值浦旱。

# 分組求和
df.groupby('A').agg('sum')
   B   C
A       
1  3  14
2  7  10

序列分組

可以根據(jù)數(shù)據(jù)框外的序列數(shù)據(jù)對(duì)數(shù)據(jù)框進(jìn)行分組,需要注意序列長(zhǎng)度需要與數(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ù)框的多列對(duì)數(shù)據(jù)框進(jìn)行分組颁湖。

# 數(shù)據(jù)準(zhǔn)備
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ìn)行分組,然后求和例隆。

# 根據(jù)多列分組求和
df.groupby(['A','B']).agg('sum')
      C
A B    
1 3   6
  4   8
2 3  10

索引分組

可以根據(jù)索引對(duì)數(shù)據(jù)框進(jìn)行分組甥捺,需要設(shè)置level參數(shù)。

# 數(shù)據(jù)準(zhǔn)備
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è)置參數(shù)level=0镰禾。

# 根據(jù)索引分組求和
df.groupby(level=0).agg('sum')
   A  B   C
a  2  7  14
b  4  6  10

當(dāng)數(shù)據(jù)框索引有多層時(shí),也可以根據(jù)需求設(shè)置level參數(shù)唱逢,完成分組聚合吴侦。

# 數(shù)據(jù)準(zhǔn)備
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

設(shè)置level參數(shù),如需要根據(jù)第一層索引坞古,即id1進(jìn)行分組备韧,可以設(shè)置level=0level='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

聚合

分組后一般會(huì)進(jìn)行聚合操作痪枫,用agg方法進(jìn)行聚合织堂。

# 數(shù)據(jù)準(zhǔn)備
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ù)對(duì)多列

對(duì)分組后數(shù)據(jù)框使用單個(gè)函數(shù)進(jìn)行聚合,單個(gè)聚合函數(shù)會(huì)對(duì)每列進(jìn)行計(jì)算奶陈,然后合并返回易阳。聚合函數(shù)以字符串的形式傳入。

# 對(duì)所有列分組求和
df.groupby('A').agg('sum')
   B   C   D
A           
1  7  14   7
2  6  10  12

可以對(duì)分組后的數(shù)據(jù)指定列進(jìn)行分組聚合吃粒。需要注意子列需要用[]包裹闽烙。

# 對(duì)指定列分組求和
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ù)對(duì)多列

聚合函數(shù)可以是多個(gè)函數(shù)声搁。聚合時(shí)黑竞,多個(gè)聚合函數(shù)會(huì)對(duì)每列進(jìn)行計(jì)算,然后合并返回疏旨。聚合函數(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ù)名遏匆。如果需要對(duì)返回的聚合函數(shù)名重命名法挨,
需要在傳參時(shí),傳入元組幅聘,第一個(gè)元素為聚合函數(shù)名凡纳,第二個(gè)元素為聚合函數(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

如果需要對(duì)不同的列進(jìn)行不同的聚合計(jì)算,則需要傳入字典的形式葛超。

# 不同列不同聚合函數(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

可以重命名聚合后的列名暴氏,注意只能對(duì)一列傳入一個(gè)聚合函數(shù)時(shí)有效

# 聚合后重命名列名
df.groupby('A').agg(B_sum=('B','sum'),C_mean=('C','mean'))
   B_sum  C_mean
A               
1      7       7
2      6       5
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绣张,一起剝皮案震驚了整個(gè)濱河市答渔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侥涵,老刑警劉巖沼撕,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芜飘,居然都是意外死亡务豺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門燃箭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人舍败,你說(shuō)我怎么就攤上這事招狸。” “怎么了邻薯?”我有些...
    開(kāi)封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵裙戏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我厕诡,道長(zhǎng)累榜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任灵嫌,我火速辦了婚禮壹罚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寿羞。我一直安慰自己猖凛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布绪穆。 她就那樣靜靜地躺著辨泳,像睡著了一般虱岂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菠红,一...
    開(kāi)封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天第岖,我揣著相機(jī)與錄音,去河邊找鬼试溯。 笑死蔑滓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耍共。 我是一名探鬼主播烫饼,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼试读!你這毒婦竟也來(lái)了杠纵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钩骇,失蹤者是張志新(化名)和其女友劉穎比藻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體倘屹,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡银亲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纽匙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片务蝠。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烛缔,靈堂內(nèi)的尸體忽然破棺而出馏段,到底是詐尸還是另有隱情,我是刑警寧澤践瓷,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布院喜,位于F島的核電站,受9級(jí)特大地震影響晕翠,放射性物質(zhì)發(fā)生泄漏喷舀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一淋肾、第九天 我趴在偏房一處隱蔽的房頂上張望硫麻。 院中可真熱鬧,春花似錦樊卓、人聲如沸庶香。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赶掖。三九已至感猛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奢赂,已是汗流浹背陪白。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膳灶,地道東北人咱士。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像轧钓,于是被迫代替她去往敵國(guó)和親序厉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在日常數(shù)據(jù)分析時(shí)毕箍,經(jīng)常會(huì)遇到需要按列分組 (groupby) 的任務(wù)弛房,如計(jì)算某公司各部門的人數(shù),計(jì)算各部門男女平均...
    心宇gxy閱讀 580評(píng)論 0 1
  • Pandas分組聚合 - 基礎(chǔ) 數(shù)據(jù)分析階段: 數(shù)據(jù)規(guī)整(清洗)階段后而柑,下一階段就是 分組聚合 對(duì)數(shù)據(jù)集分組并對(duì)各...
    羋學(xué)僧閱讀 501評(píng)論 0 3
  • 一文捶、數(shù)據(jù)分組 1.groupby簡(jiǎn)介 groupby的運(yùn)算核心為split-apply-combine,首先,數(shù)據(jù)...
    文嘉達(dá)_0da8閱讀 460評(píng)論 0 0
  • 數(shù)據(jù)的分組運(yùn)算和聚合 在將數(shù)據(jù)集加載媒咳、融合粹排、準(zhǔn)備好之后,通常就是計(jì)算分組統(tǒng)計(jì)或?成透視表涩澡, pandas提供了?個(gè)...
    222AblackA閱讀 245評(píng)論 0 1
  • 最后一次更新日期: 2019/4/20 pandas是基于numpy的數(shù)據(jù)分析庫(kù)顽耳,提供一些更易用的數(shù)據(jù)模型和大量高...
    jiedawang閱讀 1,429評(píng)論 0 5