pandas:apply和transform方法的性能比較

1. apply與transform

首先講一下apply() 與transform()的相同點與不一樣點python

相同點:多線程

都能針對dataframe完成特徵的計算,而且經常與groupby()方法一塊兒使用。app

不一樣點:函數

apply()裏面能夠跟自定義的函數,包括簡單的求和函數以及複雜的特徵間的差值函數等(注:apply不能直接使用agg()方法 / transform()中的python內置函數,例如sum、max、min、’count‘等方法)大數據

transform() 裏面不能跟自定義的特徵交互函數,由於transform是真針對每一元素(即每一列特徵操做)進行計算,也就是說在使用 transform() 方法時,須要記得三點:線程

一、它只能對每一列進行計算,因此在groupby()以後,.transform()以前是要指定要操做的列,這點也與apply有很大的不一樣。3d

二、因爲是隻能對每一列計算,因此方法的通用性相比apply()就侷限了不少,例如只能求列的最大/最小/均值/方差/分箱等操做orm

三、transform還有什麼用呢?最簡單的狀況是試圖將函數的結果分配回原始的dataframe。也就是說返回的shape是(len(df),1)。注:若是與groupby()方法聯合使用,須要對值進行去重blog

2. 各方法耗時

分別計算在一樣簡單需求下各組合方法的計算時長進程

2.1 transform() 方法+自定義函數

2.2 transform() 方法+python內置方法

 

 2.3 apply() 方法+自定義函數

2.4 agg() 方法+自定義函數

2.5 agg() 方法+python內置方法

2.6 結論

  • agg()+python內置方法的計算速度最快,其次是transform()+python內置方法。而 transform() 方法+自定義函數 的組合方法最慢,須要避免使用!
  • 而下面兩圖中紅框內容可觀察發現:python自帶的stats統計模塊在pandas結構中的計算也很是慢,也須要避免使用!

3. 實例分析

需求:計算每一個用戶天天

某種行爲消費次數、消費總額、消費均額、消費最大額、消費最小額

在幾個終端支付、最常支付終端號、最常支付終端號的支付次數、最少支付終端號、最少支付終端號的支付次數

某種行爲最常消費發生時間段、最常消費發生時間段的消費次數、最少消費發生時間段、最少消費發生時間段的消費次數

某種行爲最先消費時間、最晚消費時間

原始數據信息:306626 x 9

 

具體選擇哪一種方法處理,根據實際狀況肯定,在面對複雜計算時,transform() 與apply()結合使用每每會有意想不到的效果!

須要注意的是,在與apply()一塊兒使用時,transform須要進行去重操做,通常是經過指定一或多個列完成。

此外,匿名函數永遠不是一個很好的辦法,在進行簡單計算時,不管是使用transfrom、agg仍是apply,都要儘量使用自帶方法!!!

4. 小技巧

在使用apply()方法處理大數據級時,能夠考慮使用joblib中的多線程/多進程模塊構造相應函數執行計算,如下分別是採用多進程和單進程的耗時時長。

能夠看到,在260W的數據集上,多進程比單進程的計算速度能夠提高約17%~61%  。

相關文章
相關標籤/搜索