↓推薦關注↓
[ 引言 ] 雖然目前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(e10)?and?(e>=5):
returnc+d
elife5:
????????returna+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等操作
%%time
df['new']=df['c']*df['d']#defaultcasee==10
mask=df['e']10
df.loc[mask,'new']=df['c']+df['d']
mask=df['e']5
df.loc[mask,'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']10
df.loc[mask,'new']=df['c']+df['d']
mask=df['e']5
df.loc[mask,'new']=df['a']+df['b']
CPUtimes:user71.3ms,sys:42.5ms,total:114ms
Walltime:116ms
05轉化為values處理 在能轉化為.values的地方盡可能轉化為.values,再進行操作。
- 此處先轉化為.values等價于轉化為numpy,這樣我們的向量化操作會更加快捷。
%%time
df['new']=df['c'].values*df['d'].values#defaultcasee==10
mask=df['e'].values10
df.loc[mask,'new']=df['c']+df['d']
mask=df['e'].values5
df.loc[mask,'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
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
SWIFT
+關注
關注
0文章
112瀏覽量
23788 -
函數
+關注
關注
3文章
4306瀏覽量
62431 -
向量
+關注
關注
0文章
55瀏覽量
11658
原文標題:Pandas 中 Apply 函數加速百倍的技巧
文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
SUMIF函數與SUMIFS函數的區別
SUMIF函數和SUMIFS函數都是Excel中用于條件求和的函數,它們可以幫助用戶根據特定的條件對數據進行求和。盡管它們的基本功能相似,但在使用場景和功能上存在一些差異。以下是對這兩個函數
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
PSoC 6 MCUBoot和mbedTLS是否支持加密硬件加速?
。 使用 MCUBoot 驗證兩個應用程序時,運行時間大約需要五秒鐘。
在 README.md 的 \"安全 \"一欄中寫道
與軟件實現相比,硬件加速加密技術將啟動時間縮短了四倍多
發表于 05-29 08:17
回調函數(callback)是什么?回調函數的實現方法
回調函數是一種特殊的函數,它作為參數傳遞給另一個函數,并在被調用函數執行完畢后被調用。回調函數通常用于事件處理、異步編程和處理各種操作系統和
發表于 03-12 11:46
?2715次閱讀
TC264有矩陣庫或三角函數的加速庫嗎?
在 illd 上搜索了很長時間,并使用了 Google 等搜索引擎。我似乎沒有找到矩陣庫或相關的三角函數庫。不過,我倒是找到了一個類似于 atan2 的反正切加速函數。
發表于 03-05 07:47
RX系列三角函數單元(TFU)的使用介紹
硬件加速器三角函數單元(Trigonometric Function Unit)能夠高速處理三角函數sin、cos、arctan和sqrt(x2+y2)函數的運算,可顯著減少CPU負荷
sumif函數的使用技巧
SUMIF函數是Excel中非常常用的函數之一,它可以根據指定的條件對給定的范圍內的數值進行求和操作。在日常工作和數據處理中,我們經常需要根據某些條件來統計和匯總數據,SUMIF函數就是一個非常方便
什么是LMR-600線纜?LMR-600線纜的五大特點及其主要應用
什么是LMR-600線纜?LMR-600線纜的五大特點 LMR-600線纜的主要應用是什么? LMR-600線纜是一種常用的同軸電纜,被廣泛用于無線通信系統和射頻應用中。它具有以下五大
評論