↓推薦關(guān)注↓
[ 引言 ] 雖然目前dask,cudf等包的出現(xiàn),使得我們的數(shù)據(jù)處理大大得到了加速,但是并不是每個(gè)人都有比較好的gpu,非常多的朋友仍然還在使用pandas工具包,但有時(shí)候真的很無奈,pandas的許多問題我們都需要使用apply函數(shù)來進(jìn)行處理,而apply函數(shù)是非常慢的,本文我們就介紹如何加速apply函數(shù)600倍的技巧。
實(shí)驗(yàn)對比01Apply(Baseline) 我們以Apply為例,原始的Apply函數(shù)處理下面這個(gè)問題,需要18.4s的時(shí)間。
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加速 因?yàn)樘幚硎遣⑿械?,所以我們可以使用Swift進(jìn)行加速,在使用Swift之后,相同的操作在我的機(jī)器上可以提升到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的最快方法是將函數(shù)向量化。如果我們的操作是可以直接向量化的話,那么我們就盡可能的避免使用:
- for循環(huán);
- 列表處理;
- 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類別轉(zhuǎn)化+向量化 我們先將上面的類別轉(zhuǎn)化為int16型,再進(jìn)行相同的向量化操作,發(fā)現(xiàn)時(shí)間縮短為: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轉(zhuǎn)化為values處理 在能轉(zhuǎn)化為.values的地方盡可能轉(zhuǎn)化為.values,再進(jìn)行操作。
- 此處先轉(zhuǎn)化為.values等價(jià)于轉(zhuǎn)化為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
實(shí)驗(yàn)匯總 通過上面的一些小的技巧,我們將簡單的Apply函數(shù)加速了幾百倍,具體的:
- 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
審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
SWIFT
+關(guān)注
關(guān)注
0文章
94瀏覽量
23775 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4283瀏覽量
62325 -
向量
+關(guān)注
關(guān)注
0文章
55瀏覽量
11649
原文標(biāo)題:Pandas 中 Apply 函數(shù)加速百倍的技巧
文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
SUMIF函數(shù)與SUMIFS函數(shù)的區(qū)別
SUMIF函數(shù)和SUMIFS函數(shù)都是Excel中用于條件求和的函數(shù),它們可以幫助用戶根據(jù)特定的條件對數(shù)據(jù)進(jìn)行求和。盡管它們的基本功能相似,但在使用場景和功能上存在一些差異。以下是對這兩個(gè)函數(shù)
OPA847輸入600Khz,600mv正弦波,放大5倍,輸出在+5v附近出現(xiàn)類似三角波的波形,為什么?
各位高人,你們好:
我現(xiàn)在用DDS 產(chǎn)生600Khz,600mv正弦波作為OPA847輸入,放大5倍,輸出在+5v附近出現(xiàn)類似三角波的波形,換了R114值多次,沒用,求高人指點(diǎn)。用TINA仿真完全正常,在板子上就是不輸出?。「?/div>
發(fā)表于 09-12 07:14
請問OPA690可以用作5倍或者10倍的放大嗎?電阻如何選擇?
這是OPA690數(shù)據(jù)手冊中典型電路,我按照其電阻值的設(shè)置,焊接了一個(gè)電路。由于我們實(shí)驗(yàn)室的信號發(fā)生器的輸出能力不行,輸入端的50ohm的電阻會將我的信號幅度拉低,我將其換成600ohm左右的電阻
發(fā)表于 09-12 06:10
600W 電源單元600W-ACDC-GEVB數(shù)據(jù)手冊
電子發(fā)燒友網(wǎng)站提供《600W 電源單元600W-ACDC-GEVB數(shù)據(jù)手冊.rar》資料免費(fèi)下載
發(fā)表于 04-28 17:33
?3次下載
SEMICON China 2024 國際半導(dǎo)體展圓滿收官,加速科技硬核產(chǎn)品實(shí)力圈粉!我們明年再見!
加速科技
加速科技
發(fā)布于 :2024年03月29日 16:36:28
回調(diào)函數(shù)(callback)是什么?回調(diào)函數(shù)的實(shí)現(xiàn)方法
回調(diào)函數(shù)是一種特殊的函數(shù),它作為參數(shù)傳遞給另一個(gè)函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后被調(diào)用。回調(diào)函數(shù)通常用于事件處理、異步編程和處理各種操作系統(tǒng)和
發(fā)表于 03-12 11:46
?2648次閱讀
函數(shù)指針與回調(diào)函數(shù)的應(yīng)用實(shí)例
通常我們說的指針變量是指向一個(gè)整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。
函數(shù)指針可以像一般函數(shù)一樣,用于調(diào)用函數(shù)、傳遞參數(shù)。
TC264有矩陣庫或三角函數(shù)的加速庫嗎?
在 illd 上搜索了很長時(shí)間,并使用了 Google 等搜索引擎。我似乎沒有找到矩陣庫或相關(guān)的三角函數(shù)庫。不過,我倒是找到了一個(gè)類似于 atan2 的反正切加速函數(shù)。
發(fā)表于 03-05 07:47
內(nèi)聯(lián)函數(shù)定義 為什么需要內(nèi)聯(lián)函數(shù)
inline關(guān)鍵字是C99標(biāo)準(zhǔn)的型關(guān)鍵字,其作用是將函數(shù)展開,把函數(shù)的代碼復(fù)制到每一個(gè)調(diào)用處。
RX系列三角函數(shù)單元(TFU)的使用介紹
硬件加速器三角函數(shù)單元(Trigonometric Function Unit)能夠高速處理三角函數(shù)sin、cos、arctan和sqrt(x2+y2)函數(shù)的運(yùn)算,可顯著減少CPU負(fù)荷
sumif函數(shù)的使用技巧
SUMIF函數(shù)是Excel中非常常用的函數(shù)之一,它可以根據(jù)指定的條件對給定的范圍內(nèi)的數(shù)值進(jìn)行求和操作。在日常工作和數(shù)據(jù)處理中,我們經(jīng)常需要根據(jù)某些條件來統(tǒng)計(jì)和匯總數(shù)據(jù),SUMIF函數(shù)就是一個(gè)非常方便
c語言中函數(shù)的函數(shù)體用什么符號括起來
函數(shù) 是指將一組能完成一個(gè)功能或多個(gè)功能的語句放在一起的 代碼結(jié)構(gòu) 。 在 C語言程序 中,至少會包含一個(gè)函數(shù),及主函數(shù)main()。本文將詳細(xì)講解關(guān)于函數(shù)的相關(guān)內(nèi)容。 Part1
append()和insert()函數(shù)的區(qū)別
在Python中, append() 和 insert() 是用于修改列表的兩個(gè)常用函數(shù)。這兩個(gè)函數(shù)的主要區(qū)別在于元素添加的位置和方式。 首先,讓我們來了解一下 append() 函數(shù)
如何查看及更改函數(shù)/函數(shù)塊的調(diào)用環(huán)境
模塊化設(shè)計(jì)的思想是把一些相似的功能(比如電機(jī)控制、閥控制)設(shè)計(jì)成函數(shù)或函數(shù)塊,這樣就可以反復(fù)調(diào)用。其優(yōu)點(diǎn)是:使程序架構(gòu)更加清晰,避免重復(fù)編寫相似功能的代碼。不過可能會產(chǎn)生一個(gè)疑惑:既然PLC的程序
評論