pandas數(shù)據(jù)分組和聚合操作方法
《Python for Data Analysis》
GroupBy
分組運算:split-apply-combine(拆分-應(yīng)用-合并)
DataFrame可以在其行(axis=0)或列(axis=1)上進行分組。然后,將一個函數(shù)應(yīng)用到各個分組并產(chǎn)生新值。最后,所有這些函數(shù)的執(zhí)行結(jié)果會被合并到最終的結(jié)果對象中去。
GroupBy的size方法可以返回一個含有分組大小的Series。
對分組進行迭代
for (k1,k2), group in df.groupby(['key1','key2']): print k1,k2 print group
選取一個或一組列
df.groupby(['key1','key2'])[['data2']].mean()
通過字典或Series進行分組
只需將字典或Series傳給groupby即可。
通過函數(shù)分組
people.groupby(len).sum() #根據(jù)人名的長度進行分組
通過索引級別分組
層次化索引數(shù)據(jù),根據(jù)索引級別進行聚合,通過level關(guān)鍵字傳入級別編號或名稱。
df.groupby(level='cty',axis=1).count()
數(shù)據(jù)聚合
經(jīng)過優(yōu)化的groupby方法
函數(shù)名 | 說明 |
---|---|
count | 分組中非NA值得數(shù)量 |
sum | 非NA值的和 |
mean | 非NA值的平均值 |
median | 非NA值的算術(shù)平均數(shù) |
std、var | 無偏(分母為n-1)標準差和方差 |
min、max | 非NA值的最小值和最大值 |
prod | 非NA值的積 |
first、last | 第一個和最后一個非NA值 |
對于上述描述統(tǒng)計方法,可以將函數(shù)名以字符串的形式傳入agg方法。例如:grouped.agg(['mean', 'std'])
如果要使用自己的聚合函數(shù),只需將其傳入aggregate或agg方法即可
def peak_to_peak(arr): return arr.max() - arr.min() grouped.agg(peak_to_peak)
面向列的多函數(shù)應(yīng)用,可以對不同的列使用不同的聚合函數(shù)或者一次應(yīng)用多個函數(shù)。
如果傳入一組函數(shù)或函數(shù)名,得到的DataFrame的列就會以相應(yīng)的函數(shù)命名
如果傳入的是一個由(name,function)元組組成的列表,各個元組的第一個元素就會被用作DataFrame的列名。
不同的列使用不同的聚合函數(shù)也可以向agg傳入一個從列名映射到函數(shù)的字典
grouped.agg(['mean', 'std', peak_to_peak]) # 1 grouped.agg([('foo', 'mean'), ('bar', np.std)]) # 2 functions = ['count', 'mean', 'max'] result = grouped['tip', 'bill'].agg(functions) # 3 grouped.agg({'tip' : np.max, 'bill' : 'sum'}) # 4
分組級運算和轉(zhuǎn)換
transform
transform會將一個函數(shù)應(yīng)用到各個分組,然后將結(jié)果放置到適當?shù)奈恢蒙?。如果各個分組產(chǎn)生的是一個標量值,則該值就會被廣播出去。
apply
一般性的“拆分-應(yīng)用-合并”
tips.groupby('smoker').apply(top)相當于top函數(shù)在DataFrame的各個片段上調(diào)用,然后結(jié)果由pandas.concat組裝到一起,并以分組名稱進行了標記。,于是,最終結(jié)果就有了一個層次化索引,其內(nèi)層索引值來自于原DataFrame.
禁止分組鍵: 分組鍵會跟原始對象的索引共同構(gòu)成結(jié)果對象中的層次化索引。將group_keys=False傳入groupby即可禁止該效果。tips.groupby('smoker', group_keys=False).apply(top)
在GroupBy對象上調(diào)用describe相當于f = lambda x : x.describe(); grouped.apply(f).
數(shù)據(jù)匯總工具
透視表 pivot_table
根據(jù)一個或多個鍵對數(shù)據(jù)進行聚合,并根據(jù)行和列上的分組鍵將數(shù)據(jù)分配到各個矩形區(qū)域。
tips.pivot_table('tip_pct', index=['time', 'size', 'smoker'], columns='day', aggfunc='mean', fill_value=0)
參數(shù)名 | 說明 |
---|---|
values | 待聚合的列的名稱。默認所有列 |
rows | 用于分組的列名或者其他分組鍵,出現(xiàn)在結(jié)果透視表的行 |
cols | 用于分組的列名或者其他分組鍵,出現(xiàn)在結(jié)果透視表的列 |
aggfunc | 聚合函數(shù)或函數(shù)列表,默認“mean”??梢允侨魏螌roupby有效的函數(shù) |
fill_value | 用于替換結(jié)果表中缺失值 |
margins | 添加行/列小計和總計,默認為False |
交叉表 crosstab
是一種用于計算分組頻率的特殊透視表。
pd.crosstab([tips.time, tips.day], tips.smoker, margins=True)
以上這篇pandas數(shù)據(jù)分組和聚合操作方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
django 將model轉(zhuǎn)換為字典的方法示例
平常的開發(fā)過程中不免遇到需要把model轉(zhuǎn)成字典的需求,這篇文章主要介紹了Django model轉(zhuǎn)字典的方法,非常具有實用價值,需要的朋友可以參考下2018-10-10Python 、Pycharm、Anaconda三者的區(qū)別與聯(lián)系、安裝過程及注意事項
這篇文章主要介紹了Python,Pycharm,Anaconda三者的區(qū)別與聯(lián)系、安裝過程及其注意事項,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10Python實現(xiàn)多項式擬合正弦函數(shù)詳情
這篇文章主要介紹了Python實現(xiàn)多項式擬合正弦函數(shù)詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08Python雙向循環(huán)鏈表實現(xiàn)方法分析
這篇文章主要介紹了Python雙向循環(huán)鏈表,結(jié)合實例形式分析了Python雙向鏈表的定義、遍歷、添加、刪除、搜索等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07Keras實現(xiàn)支持masking的Flatten層代碼
這篇文章主要介紹了Keras實現(xiàn)支持masking的Flatten層代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06