pandas中apply和transform方法的性能比較及區(qū)別介紹
1. apply與transform
首先講一下apply() 與transform()的相同點(diǎn)與不同點(diǎn)
相同點(diǎn):
都能針對(duì)dataframe完成特征的計(jì)算,并且常常與groupby()方法一起使用。
不同點(diǎn):
apply()里面可以跟自定義的函數(shù),包括簡(jiǎn)單的求和函數(shù)以及復(fù)雜的特征間的差值函數(shù)等(注:apply不能直接使用agg()方法 / transform()中的python內(nèi)置函數(shù),例如sum、max、min、'count‘等方法)
transform() 里面不能跟自定義的特征交互函數(shù),因?yàn)閠ransform是真針對(duì)每一元素(即每一列特征操作)進(jìn)行計(jì)算,也就是說(shuō)在使用 transform() 方法時(shí),需要記得三點(diǎn):
1、它只能對(duì)每一列進(jìn)行計(jì)算,所以在groupby()之后,.transform()之前是要指定要操作的列,這點(diǎn)也與apply有很大的不同。
2、由于是只能對(duì)每一列計(jì)算,所以方法的通用性相比apply()就局限了很多,例如只能求列的最大/最小/均值/方差/分箱等操作
3、transform還有什么用呢?最簡(jiǎn)單的情況是試圖將函數(shù)的結(jié)果分配回原始的dataframe。也就是說(shuō)返回的shape是(len(df),1)。注:如果與groupby()方法聯(lián)合使用,需要對(duì)值進(jìn)行去重
2. 各方法耗時(shí)
分別計(jì)算在同樣簡(jiǎn)單需求下各組合方法的計(jì)算時(shí)長(zhǎng)
2.1 transform() 方法+自定義函數(shù)
2.2 transform() 方法+python內(nèi)置方法
2.3 apply() 方法+自定義函數(shù)
2.4 agg() 方法+自定義函數(shù)
2.5 agg() 方法+python內(nèi)置方法
2.6 結(jié)論
agg()+python內(nèi)置方法的計(jì)算速度最快,其次是transform()+python內(nèi)置方法。而 transform() 方法+自定義函數(shù) 的組合方法最慢,需要避免使用!
而下面兩圖中紅框內(nèi)容可觀察發(fā)現(xiàn):python自帶的stats統(tǒng)計(jì)模塊在pandas結(jié)構(gòu)中的計(jì)算也非常慢,也需要避免使用!
3. 實(shí)例分析
需求:計(jì)算每個(gè)用戶每天
某種行為消費(fèi)次數(shù)、消費(fèi)總額、消費(fèi)均額、消費(fèi)最大額、消費(fèi)最小額
在幾個(gè)終端支付、最常支付終端號(hào)、最常支付終端號(hào)的支付次數(shù)、最少支付終端號(hào)、最少支付終端號(hào)的支付次數(shù)
某種行為最常消費(fèi)發(fā)生時(shí)間段、最常消費(fèi)發(fā)生時(shí)間段的消費(fèi)次數(shù)、最少消費(fèi)發(fā)生時(shí)間段、最少消費(fèi)發(fā)生時(shí)間段的消費(fèi)次數(shù)
某種行為最早消費(fèi)時(shí)間、最晚消費(fèi)時(shí)間
原始數(shù)據(jù)信息:306626 x 9
具體選擇哪種方法處理,根據(jù)實(shí)際情況確定,在面對(duì)復(fù)雜計(jì)算時(shí),transform() 與apply()結(jié)合使用往往會(huì)有意想不到的效果!
需要注意的是,在與apply()一起使用時(shí),transform需要進(jìn)行去重操作,一般是通過(guò)指定一或多個(gè)列完成。
此外,匿名函數(shù)永遠(yuǎn)不是一個(gè)很好的辦法,在進(jìn)行簡(jiǎn)單計(jì)算時(shí),無(wú)論是使用transfrom、agg還是apply,都要盡可能使用自帶方法!?。?/p>
4. 小技巧
在使用apply()方法處理大數(shù)據(jù)級(jí)時(shí),可以考慮使用joblib中的多線程/多進(jìn)程模塊構(gòu)造相應(yīng)函數(shù)執(zhí)行計(jì)算,以下分別是采用多進(jìn)程和單進(jìn)程的耗時(shí)時(shí)長(zhǎng)。
可以看到,在260W的數(shù)據(jù)集上,多進(jìn)程比單進(jìn)程的計(jì)算速度可以提升約17%~61% 。
總結(jié)
以上所述是小編給大家介紹的pandas中apply和transform方法的性能比較,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
python中使用you-get庫(kù)批量在線下載bilibili視頻的教程
這篇文章主要介紹了使用python中you-get庫(kù)批量在線下載bilibili視頻的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Python查詢Mysql時(shí)返回字典結(jié)構(gòu)的代碼
MySQLdb默認(rèn)查詢結(jié)果都是返回tuple,輸出時(shí)候不是很方便,必須按照0,1這樣讀取,無(wú)意中在網(wǎng)上找到簡(jiǎn)單的修改方法,就是傳遞一個(gè)cursors.DictCursor就行2012-06-06Python如何快速實(shí)現(xiàn)分布式任務(wù)
這篇文章主要介紹了Python如何快速實(shí)現(xiàn)分布式任務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07Django中ajax發(fā)送post請(qǐng)求 報(bào)403錯(cuò)誤CSRF驗(yàn)證失敗解決方案
這篇文章主要介紹了Django中ajax發(fā)送post請(qǐng)求 報(bào)403錯(cuò)誤CSRF驗(yàn)證失敗解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python抓取網(wǎng)頁(yè)圖片并放到指定文件夾
這篇文章主要介紹了python抓取網(wǎng)頁(yè)圖片并放到指定文件夾,需要的朋友可以參考下2014-04-04Django框架使用內(nèi)置方法實(shí)現(xiàn)登錄功能詳解
這篇文章主要介紹了Django框架使用內(nèi)置方法實(shí)現(xiàn)登錄功能,結(jié)合實(shí)例形式詳細(xì)分析了Django框架內(nèi)置方法實(shí)現(xiàn)登錄功能的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-06-06python實(shí)現(xiàn)發(fā)送QQ郵件(可加附件)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)發(fā)送QQ郵件,可添加附件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12Python 生成 -1~1 之間的隨機(jī)數(shù)矩陣方法
今天小編就為大家分享一篇Python 生成 -1~1 之間的隨機(jī)數(shù)矩陣方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08python模塊詳解之pywin32使用文檔(python操作windowsAPI)
pywin32是一個(gè)第三方模塊庫(kù),主要的作用是方便python開(kāi)發(fā)者快速調(diào)用windows API的一個(gè)模塊庫(kù),這篇文章主要給大家介紹了關(guān)于python模塊詳解之pywin32使用文檔的相關(guān)資料,文中將python操作windowsAPI介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01