pandas的聚合操作: groupyby與agg


pandas提供基於行和列的聚合操作,groupby可理解為是基於行的,agg則是基於列的

從實現上看,groupby返回的是一個DataFrameGroupBy結構,這個結構必須調用聚合函數(如sum)之后,才會得到結構為Series的數據結果。 
而agg是DataFrame的直接方法,返回的也是一個DataFrame。當然,很多功能用sum、mean等等也可以實現。但是agg更加簡潔, 而且傳給它的函數可以是字符串,也可以自定義,參數是column對應的子DataFrame

一、pandas.group_by

首先來看一下案例的數據格式,使用head函數調用DataFrame的前8條記錄,這里一共4個屬性

column_map.head(8)


work_order 表示工序, work_station表示工位,rang_low, range_high 表示對應記錄的上下限,現在使用groupby統計每個工序工位下面各有多少條記錄

 
        
column_map.groupby(['work_order','work_station'])
 
        

我們會發現輸出的是一個GroupBy類,並非我們想要的結果

 
        
 <pandas.core.groupby.DataFrameGroupBy object at 0x111242630>
 
        

還需要加上一個聚合函數,比如

 
        
wo_ws_group = column_map.groupby(['work_order','work_station']) wo_ws_group.size()
 
        

我們就可以得到

新出現的列對應着每個工序工位下面有多少條記錄 
但是我們可以發現它的格式已經和我們平時使用的DataFrame不太一樣了,我們可以使用下面的命令解決

wo_ws_group.size().reset_index()

想要查詢具體每一個記錄,可以使用loc命令

使用get_group可以查詢具體每一個分組下面的所有記錄

wo_ws_group.get_group(('0','11'))

 

 因為比較多就顯示全部了,使用head,顯示前幾條記錄

wo_ws_group.get_group(('0','11')).head(8)

 

 

我們還可以使用idxmin(),idxmax()函數,獲得每一個分組下面所有記錄中數值最大最小的index

wo_ws_group['range_low'].idxmin()

對於分組結果的每一列還可以使用apply,進行一些函數的二次處理,如

wo_ws_group['work_order'].apply(lambda x:2*x).head(8)

由於這里的0是字符串類型,所以2*以后都變成了2個0

二、pandas.agg

agg的使用比groupby還要簡介一些,我們現自己創建一個DataFrame作為例子

data = pd.DataFrame([[2,11],[1,23],[5,11],[1.3,44],[5,111]],columns = ['price','quantity'],dtype = float)

使用agg統計每一列的求和與平均值

data.agg({'price':['sum','mean'],'quantity':['sum']})

如果需要自定義一些函數的 話可以使用lambda函數

 

 

 

 

 

 
        

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM