吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何加速apply函數600倍的技巧

數據分析與開發 ? 來源:kaggle競賽寶典 ? 作者:杰少 ? 2022-05-12 10:14 ? 次閱讀

推薦關注↓

[ 引言 ] 雖然目前dask,cudf等包的出現,使得我們的數據處理大大得到了加速,但是并不是每個人都有比較好的gpu,非常多的朋友仍然還在使用pandas工具包,但有時候真的很無奈,pandas的許多問題我們都需要使用apply函數來進行處理,而apply函數是非常慢的,本文我們就介紹如何加速apply函數600倍的技巧。

實驗對比01Apply(Baseline) 我們以Apply為例,原始的Apply函數處理下面這個問題,需要18.4s的時間。
importpandasaspd
importnumpyasnp
df=pd.DataFrame(np.random.randint(0,11,size=(1000000,5)),columns=('a','b','c','d','e'))
deffunc(a,b,c,d,e):
ife==10:
returnc*d
elif(e=5):
returnc+d
elifereturna+b
%%time
df['new']=df.apply(lambdax:func(x['a'],x['b'],x['c'],x['d'],x['e']),axis=1)
CPUtimes:user17.9s,sys:301ms,total:18.2s
Walltime:18.4s

		
			02Swift加速
											因為處理是并行的,所以我們可以使用Swift進行加速,在使用Swift之后,相同的操作在我的機器上可以提升到7.67s。
			
%%time
#!pipinstallswifter
importswifter
df['new']=df.swifter.apply(lambdax:func(x['a'],x['b'],x['c'],x['d'],x['e']),axis=1)
HBox(children=(HTML(value='DaskApply'),FloatProgress(value=0.0,max=16.0),HTML(value='')))

CPUtimes:user329ms,sys:240ms,total:569ms
Walltime:7.67s

		
			03向量化
											使用Pandas和Numpy的最快方法是將函數向量化。如果我們的操作是可以直接向量化的話,那么我們就盡可能的避免使用:
			
  • for循環;
  • 列表處理;
  • apply等操作
在將上面的問題轉化為下面的處理之后,我們的時間縮短為:421 ms。
%%time
df['new']=df['c']*df['d']#defaultcasee==10
mask=df['e']'new']=df['c']+df['d']
mask=df['e']'new']=df['a']+df['b']
CPUtimes:user134ms,sys:149ms,total:283ms
Walltime:421ms

		
			04類別轉化+向量化
											我們先將上面的類別轉化為int16型,再進行相同的向量化操作,發現時間縮短為:116 ms。
			
forcolin('a','b','c','d'):
df[col]=df[col].astype(np.int16)
%%time
df['new']=df['c']*df['d']#defaultcasee==10
mask=df['e']'new']=df['c']+df['d']
mask=df['e']'new']=df['a']+df['b']
CPUtimes:user71.3ms,sys:42.5ms,total:114ms
Walltime:116ms

		
			
											05轉化為values處理
											在能轉化為.values的地方盡可能轉化為.values,再進行操作。 
			
  • 此處先轉化為.values等價于轉化為numpy,這樣我們的向量化操作會更加快捷。
于是,上面的操作時間又被縮短為:74.9ms。
%%time
df['new']=df['c'].values*df['d'].values#defaultcasee==10
mask=df['e'].values'new']=df['c']+df['d']
mask=df['e'].values'new']=df['a']+df['b']
CPUtimes:user64.5ms,sys:12.5ms,total:77ms
Walltime:74.9ms

		
			

		
			實驗匯總
						通過上面的一些小的技巧,我們將簡單的Apply函數加速了幾百倍,具體的:
			
  • Apply: 18.4 s
  • Apply + Swifter: 7.67 s
  • Pandas vectorizatoin: 421 ms
  • Pandas vectorization + data types: 116 ms
  • Pandas vectorization + values + data types: 74.9ms
參考文獻:Do You Use Apply in Pandas? There is a 600x Faster Way

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SWIFT
    +關注

    關注

    0

    文章

    116

    瀏覽量

    23850
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62972
  • 向量
    +關注

    關注

    0

    文章

    55

    瀏覽量

    11705

原文標題:Pandas 中 Apply 函數加速百倍的技巧

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AN207 GD32G5x3三角函數加速器TMU的使用說明

    電子發燒友網站提供《AN207 GD32G5x3三角函數加速器TMU的使用說明.pdf》資料免費下載
    發表于 01-21 17:30 ?0次下載
    AN207 GD32G5x3三角<b class='flag-5'>函數</b><b class='flag-5'>加速</b>器TMU的使用說明

    使用LIS2DW12TR加速度傳感器可以計算物體重力方向運動的距離嗎

    我先計算靜止狀態下的物體加速度,判斷加速度大于靜止的1.01時,開始計時間。通過實時加速度和初始加速度的差值更新速度,通過積分,計算每一段
    發表于 12-12 16:21

    SUMIF函數與SUMIFS函數的區別

    SUMIF函數和SUMIFS函數都是Excel中用于條件求和的函數,它們可以幫助用戶根據特定的條件對數據進行求和。盡管它們的基本功能相似,但在使用場景和功能上存在一些差異。以下是對這兩個函數
    的頭像 發表于 10-30 09:51 ?1572次閱讀

    OPA847輸入600Khz,600mv正弦波,放大5,輸出在+5v附近出現類似三角波的波形,為什么?

    各位高人,你們好: 我現在用DDS 產生600Khz,600mv正弦波作為OPA847輸入,放大5,輸出在+5v附近出現類似三角波的波形,換了R114值多次,沒用,求高人指點。用TINA仿真完全正常,在板子上就是不輸出!!附
    發表于 09-12 07:14

    請問OPA690可以用作5或者10的放大嗎?電阻如何選擇?

    這是OPA690數據手冊中典型電路,我按照其電阻值的設置,焊接了一個電路。由于我們實驗室的信號發生器的輸出能力不行,輸入端的50ohm的電阻會將我的信號幅度拉低,我將其換成600ohm左右的電阻
    發表于 09-12 06:10

    面試常考+1:函數指針與指針函數、數組指針與指針數組

    在嵌入式開發領域,函數指針、指針函數、數組指針和指針數組是一些非常重要但又容易混淆的概念。理解它們的特性和應用場景,對于提升嵌入式程序的效率和質量至關重要。一、指針函數函數指針指針
    的頭像 發表于 08-10 08:11 ?989次閱讀
    面試常考+1:<b class='flag-5'>函數</b>指針與指針<b class='flag-5'>函數</b>、數組指針與指針數組

    labview的積分函數用哪個?

    對標準正弦加速度數據求速度,使用了積分函數,但是得到的積分結果不是標準的余弦,請問是為什么
    發表于 05-30 15:13

    PSoC 6 MCUBoot和mbedTLS是否支持加密硬件加速

    。 使用 MCUBoot 驗證兩個應用程序時,運行時間大約需要五秒鐘。 在 README.md 的 \"安全 \"一欄中寫道 與軟件實現相比,硬件加速加密技術將啟動時間縮短了四
    發表于 05-29 08:17

    600W 電源單元600W-ACDC-GEVB數據手冊

    電子發燒友網站提供《600W 電源單元600W-ACDC-GEVB數據手冊.rar》資料免費下載
    發表于 04-28 17:33 ?4次下載
    <b class='flag-5'>600</b>W 電源單元<b class='flag-5'>600</b>W-ACDC-GEVB數據手冊

    回調函數(callback)是什么?回調函數的實現方法

    回調函數是一種特殊的函數,它作為參數傳遞給另一個函數,并在被調用函數執行完畢后被調用。回調函數通常用于事件處理、異步編程和處理各種操作系統和
    發表于 03-12 11:46 ?3142次閱讀

    函數指針與回調函數的應用實例

    通常我們說的指針變量是指向一個整型、字符型或數組等變量,而函數指針是指向函數函數指針可以像一般函數一樣,用于調用函數、傳遞參數。
    的頭像 發表于 03-07 11:13 ?435次閱讀
    <b class='flag-5'>函數</b>指針與回調<b class='flag-5'>函數</b>的應用實例

    TC264有矩陣庫或三角函數加速庫嗎?

    在 illd 上搜索了很長時間,并使用了 Google 等搜索引擎。我似乎沒有找到矩陣庫或相關的三角函數庫。不過,我倒是找到了一個類似于 atan2 的反正切加速函數
    發表于 03-05 07:47

    內聯函數定義 為什么需要內聯函數

    inline關鍵字是C99標準的型關鍵字,其作用是將函數展開,把函數的代碼復制到每一個調用處。
    的頭像 發表于 02-19 12:20 ?595次閱讀

    PSOC6支持的屏幕分辨率最大能到600*600嗎?

    現在PSOC6支持的屏幕分辨率最大能到600*600嗎?
    發表于 02-19 08:24
    百家乐怎样下注| 二八杠语音报牌器| 大发888官网注册| 百家乐官网真钱娱乐| 百家乐官网用什么平台| 百家乐tt娱乐| 百家乐桌子黑色| 德州扑克大小顺序| 百家乐官网赌博游戏| 百家乐园会员注册| 大发888认识的见解| 百家乐官网是否有路子| 做生意买车白色风水| 天博百家乐的玩法技巧和规则| 海立方百利宫娱乐城| 百合百家乐官网的玩法技巧和规则 | 百家乐官网稳赚的方法| 百家乐官网怎么玩| 百家乐太阳娱乐网| 百家乐官网虚拟视频| 保单百家乐游戏机| 新浪棋牌竞技风暴| 百家乐官网策略大全| 百家乐赌博经历| BET365备用网址| 免费百家乐官网计划软件| 威尼斯人娱乐城信誉怎么样| 百家乐套利| 真人百家乐官网娱乐好玩| 百家乐侧牌器| 网上玩百家乐官网犯法| 澳门百家乐看路博客| 龙腾国际娱乐| 嘉年华百家乐官网的玩法技巧和规则 | 娱乐城送彩金| 百家乐官网百家乐官网技巧| 大发888 大发888| 百家乐官网小路规则| 大发888移动版| 百家乐官网vshow| 大发888总结经验|