↓推薦關(guān)注↓
[ 引言 ] 雖然目前dask,cudf等包的出現(xiàn),使得我們的數(shù)據(jù)處理大大得到了加速,但是并不是每個(gè)人都有比較好的gpu,非常多的朋友仍然還在使用pandas工具包,但有時(shí)候真的很無(wú)奈,pandas的許多問(wèn)題我們都需要使用apply函數(shù)來(lái)進(jìn)行處理,而apply函數(shù)是非常慢的,本文我們就介紹如何加速apply函數(shù)600倍的技巧。
實(shí)驗(yàn)對(duì)比01Apply(Baseline) 我們以Apply為例,原始的Apply函數(shù)處理下面這個(gè)問(wèn)題,需要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)樘幚硎遣⑿械模晕覀兛梢允褂肧wift進(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ù)向量化。如果我們的操作是可以直接向量化的話(huà),那么我們就盡可能的避免使用:
- 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類(lèi)別轉(zhuǎn)化+向量化 我們先將上面的類(lèi)別轉(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,這樣我們的向量化操作會(huì)更加快捷。
%%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)匯總 通過(guò)上面的一些小的技巧,我們將簡(jiǎ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
審核編輯 :李倩
-
SWIFT
+關(guān)注
關(guān)注
0文章
116瀏覽量
24361 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64921 -
向量
+關(guān)注
關(guān)注
0文章
55瀏覽量
11896
原文標(biāo)題:Pandas 中 Apply 函數(shù)加速百倍的技巧
文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
使用NVIDIA CUDA-X庫(kù)加速科學(xué)和工程發(fā)展
詳解RTOS中的Hook函數(shù)
AN207 GD32G5x3三角函數(shù)加速器TMU的使用說(shuō)明

使用LIS2DW12TR加速度傳感器可以計(jì)算物體重力方向運(yùn)動(dòng)的距離嗎
SUMIF函數(shù)對(duì)比VLOOKUP的優(yōu)勢(shì)
SUMIF函數(shù)與SUMIFS函數(shù)的區(qū)別
SUMIF函數(shù)使用教程
如何由系統(tǒng)函數(shù)求頻率響應(yīng)
什么叫系統(tǒng)的頻率響應(yīng)函數(shù)?它和傳遞函數(shù)有何關(guān)系
OPA847輸入600Khz,600mv正弦波,放大5倍,輸出在+5v附近出現(xiàn)類(lèi)似三角波的波形,為什么?
請(qǐng)問(wèn)OPA690可以用作5倍或者10倍的放大嗎?電阻如何選擇?
面試常考+1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組

超亮燈箱PFBR-600SW2系列 助力檢測(cè)的高速化、提升檢測(cè)精度

評(píng)論