
以上的分組鍵均為Series,實際上分組鍵可以是任何長度适當的數組
可以看出沒有key2列,因為df[‘key2’]不是數值資料,是以被從結果中移除。預設情況下,所有數值列都會被聚合,雖然有時可能被過濾為一個子集。
可以看出name就是groupby中的key1的值,group就是要輸出的内容。
同理:
對group by後的内容進行操作,如轉換成字典
groupby預設是在axis=0上進行分組的,通過設定也可以在其他任何軸上進行分組.
對于大資料,很多情況是隻需要對部分列進行聚合
已知列的分組關系
如果不加axis=1, 則隻會出現 a b c d e
Series 也一樣
相較于dic或者Series,python函數在定義分組關系映射時更有創意。任何被當做分組鍵的函數都會在各個索引上被調用一次,其傳回值就會被用作分組名稱。假設你按人名的長度進行分組,僅僅傳入len即可
将函數和數組、清單、字典、Series混合使用也不是問題,因為任何東西都會最終轉換為數組
階層化索引最友善的地方就在于他能夠根據索引級别進行聚合。要實作該目的,通過level關鍵字出入級别編号或者名稱即可:
調用自定義的聚合函數
對Series或者DataFrame列的聚合運算實際是使用aggregate或者調用mean,std等方法。下面我們想對不同的列使用不同的聚合函數,或者一次應用多個函數
自動給出的列名辨識度低,如果傳入的是(name, function)元組組成的清單,則各個元組的第一個元素将被用作df的列名
對于df,可以定義一組用于全部列的函數,或在不同的列應用不同的函數
如果想對不同的列應用不同的函數, 具體的辦法是想agg傳入一個從列名映射到函數的字典
隻有将多個函數應用到至少一列時,df才能擁有階層化的列
聚合隻是分組運算的一種,它是資料轉換的特列。transform 和apply更牛叉.
transform會将一個函數應用到各個分組,然後将結果放在适當的位置. 如果各分組産生的标量值,則該标量值會被廣播出去。
transform也是有嚴格條件的特殊函數:傳入的函數隻能産生兩種結果,要麼産生一個可以廣播的标量值(如:np.mean), 要麼産生一個相同大小的結果數組。
可以看到有很多與表2一樣的值。
最一般化的groupby 方法是apply.
新生成一列
根據分組選出最高的5個tip_pct值
對smoker分組并應用該函數
多參數版本
cut and qcut與groupby結合起來,能輕松的對資料集的桶(bucket)或者分位數(quantile)分析。
這些都是長度相等的桶,要根據樣本分為數得到大小相等的桶,使用qcut即可.
長度相等的桶:區間大小相等
大小相等的桶:資料點數量相等