歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋(píng)果6袋
6
麥子學(xué)院

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合

發(fā)布時(shí)間:2018-04-21 22:20  回復(fù):0  查看:4331   最后回復(fù):2018-04-21 22:20  

本文和大家分享的主要是通過(guò)groupby進(jìn)行分組,然后通過(guò)傳入函數(shù)來(lái)返回聚合數(shù)據(jù)相關(guān)內(nèi)容,一起來(lái)看看吧,希望對(duì)大家學(xué)習(xí)python有所幫助。

  GroupBy技術(shù)

  分組運(yùn)算的第一步就是將數(shù)據(jù)按照一定的要求拆分成多個(gè)組,第二步是將函數(shù)應(yīng)用到各個(gè)分組,第三步,將這些結(jié)果合并。下圖大致說(shuō)明了這個(gè)過(guò)程。

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合


拆分-應(yīng)用-合并

  比如對(duì)于一個(gè)DataFrame,想按key1分組,并計(jì)算data1列的平均值。一種簡(jiǎn)單的做法就是使用GroupBy

  grouped = df['data1'].groupby(df['key1'])

  grouped是一個(gè)GroupBy對(duì)象,只是按照要求,對(duì)dfkey1分組,取出了data1列的值。然后,我們就可以對(duì) grouped.mean() 即可計(jì)算分組的平均值。 grouped.size() 會(huì)返回分組大小的Series。

  對(duì)分組進(jìn)行迭代

  GroupBy對(duì)象是支持迭代的,所以:

  for (k1,k2),group in df.groupby(['key1','key2']):

  print k1,k2

  print group

  k1,k2對(duì)應(yīng)key1,key2

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合


迭代GroupBy對(duì)象

  有趣的是可以把這個(gè)數(shù)據(jù)片段做成字典:

  pieces = dict(list(df.groupby('key1')))

  pieces['b']#就可以得到按照key1分組后,key1=b的數(shù)據(jù)了。

  選取一個(gè)或一組列

  對(duì)于由DataFrame產(chǎn)生的GroupBy對(duì)象.如果用一個(gè)(單個(gè)字符串)或一組(字符串?dāng)?shù)組)列名對(duì)其進(jìn)行索引,就能實(shí)現(xiàn)選取部分列進(jìn)行聚合的目的。也就是說(shuō):

  df.groupby('key1')['data1']df['data1'].groupby(df['key1'])

  兩者達(dá)到的效果是相同的。

  通過(guò)字典或Series進(jìn)行分組

  假設(shè)已知一個(gè)DataFrame,并且知道abcde分別對(duì)應(yīng)幾種顏色,要求按照顏色分組,應(yīng)該如何去做?

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合


mapping = {'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}

  其實(shí),只需將字典傳給groupby即可:

  by_column = people.groupby(mapping,axis=1)

  而Series也可以:

  map_series = Series(mapping)

  然后把map_series傳給groupby達(dá)到的效果是一樣的。

  通過(guò)函數(shù)進(jìn)行分組

  比如希望對(duì)上面的people按人名的長(zhǎng)度分組,只需要傳入len函數(shù)就可以了: people.groupby(len).sum()

  而且函數(shù)可以跟數(shù)組,列表,字典,Series這些混合使用,相當(dāng)靈活。

  根據(jù)索引級(jí)別分組

  層次化索引數(shù)據(jù)集可以通過(guò)level根據(jù)索引的級(jí)別聚合。

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合


根據(jù)索引級(jí)別分組

  數(shù)據(jù)聚合

  當(dāng)你自己構(gòu)造了一個(gè)函數(shù),并想用在groupby上時(shí),可以使用aggregateagg方法grouped.agg(peak_to_peak)

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合


一些方法

  面向列的多函數(shù)應(yīng)用

  如果想對(duì)不同的列使用不同的聚合函數(shù),或一次應(yīng)用多個(gè)函數(shù)。

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合


一組函數(shù)

  默認(rèn)使用的列名標(biāo)識(shí)性不是很好,可以使用(name,function)元組組成的列表,則name會(huì)被作為列名了。如下:

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合


(name,function)

  對(duì)于DataFrame,你還可以定義一組應(yīng)用于全部列的函數(shù),或不同的列使用不同的函數(shù)。假設(shè)想要對(duì)tip_pcttotal_bill列計(jì)算三個(gè)統(tǒng)計(jì)信息:

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合


對(duì)多個(gè)列使用函數(shù)

  另外,想對(duì)不同的列使用不同的函數(shù)(這是很常見(jiàn)的情況),需要往agg傳入一個(gè)從列名映射到函數(shù)的字典:

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合


不同的列使用不同的函數(shù)

  無(wú)索引的形式返回聚合數(shù)據(jù)

  到目前為止.所有示例中的聚合數(shù)據(jù)都有由唯一的分組鍵組成的索引(可能還是層次化的).由于并不總是需要如此,所以你可以向groupby傳入as_index=False以禁用該功能:

  tips.groupby(['sex','smoker'],as_index = False).mean()

Python數(shù)據(jù)分析:分組運(yùn)算與數(shù)據(jù)聚合

來(lái)源:網(wǎng)絡(luò)


您還未登錄,請(qǐng)先登錄

熱門(mén)帖子

最新帖子

?