本文和大家分享的主要是通過(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ò)程。
拆分-應(yīng)用-合并
比如對(duì)于一個(gè)DataFrame,想按key1分組,并計(jì)算data1列的平均值。一種簡(jiǎn)單的做法就是使用GroupBy:
grouped = df['data1'].groupby(df['key1'])
grouped是一個(gè)GroupBy對(duì)象,只是按照要求,對(duì)df按key1分組,取出了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。
迭代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)該如何去做?
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í)別聚合。
根據(jù)索引級(jí)別分組
數(shù)據(jù)聚合
當(dāng)你自己構(gòu)造了一個(gè)函數(shù),并想用在groupby上時(shí),可以使用aggregate或agg方法: grouped.agg(peak_to_peak)
一些方法
面向列的多函數(shù)應(yīng)用
如果想對(duì)不同的列使用不同的聚合函數(shù),或一次應(yīng)用多個(gè)函數(shù)。
一組函數(shù)
默認(rèn)使用的列名標(biāo)識(shí)性不是很好,可以使用(name,function)元組組成的列表,則name會(huì)被作為列名了。如下:
(name,function)
對(duì)于DataFrame,你還可以定義一組應(yīng)用于全部列的函數(shù),或不同的列使用不同的函數(shù)。假設(shè)想要對(duì)tip_pct和total_bill列計(jì)算三個(gè)統(tǒng)計(jì)信息:
對(duì)多個(gè)列使用函數(shù)
另外,想對(duì)不同的列使用不同的函數(shù)(這是很常見(jiàn)的情況),需要往agg傳入一個(gè)從列名映射到函數(shù)的字典:
不同的列使用不同的函數(shù)
以“無(wú)索引”的形式返回聚合數(shù)據(jù)
到目前為止.所有示例中的聚合數(shù)據(jù)都有由唯一的分組鍵組成的索引(可能還是層次化的).由于并不總是需要如此,所以你可以向groupby傳入as_index=False以禁用該功能:
tips.groupby(['sex','smoker'],as_index = False).mean()
來(lái)源:網(wǎng)絡(luò)