pandas資料處理效率提公升方法

2021-10-08 08:45:55 字數 2246 閱讀 4221

方法如下:

pandas迴圈提速7萬多倍

文中提到了一種用numpy進行優化的方法,但是具體的實施方式說得並不清楚。

至於為什麼採用numpy會對pandas的迴圈有如此明顯的效果優化,stack overflow給出了解釋。

那麼了解了numpy的優勢之後,為了優化**,則需要將之前的方法替換成numpy的方式。這裡我們以乙個維度(16307, 20)的dataframe進行說明。目前涉及到的主要有以下三種:

1.直接進行values維度計算

利用timeit監測兩種方式的執行時間

%

%timeit

df['amount'

]= df[

'last_kj_amount'

]+ df[

'last_15day_amount'

]

567 µs ± 32 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%

%timeit

df['amount2'

]= df[

'last_kj_amount'

].values + df[

'last_15day_amount'

].values

221 µs ± 19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

在當前資料量並不大的情況下,速度只提公升了一倍,如果在生產中使用values值進行計算的話優化效果更好。

這裡我們對上面計算的結果進行向上取整,採用兩種方式對比,並用timeit監測執行時間。

%

%timeit

df['safe_amount1'

]= df.

(lambda x:math.ceil(x[

'amount'])

,axis =

1)

243 ms ± 16.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

def

getint

(x):

return math.ceil(x)

%%timeit

df['safe_amount2'

]= np.vectorize(getint)

(df[

'amount'

])

4.05 ms ± 162 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

可見採用np.vectorize方式,時間縮短了近60倍。

np.where類似於if…else語句,主要是用來進行條件判定和資料篩選。

%

%timeit

df['signal'

]= df.

(lambda x:

1if x[

'last_15day_amount']==

0and x[

'statis_date']==

20200506

and x[

'time_type']==

2else

0,axis =

1)

269 ms ± 31.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%

%timeit

df['signal1'

]= np.where(

(df[

'last_15day_amount']==

0)&(df[

'statis_date']==

20200506)&

(df[

'time_type']==

2),1,0)

1.59 ms ± 196 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

可見,np.where方式時間縮短了近170倍。

以上是最近工程中遇到的主要優化方式,後續想到繼續更新。

pandas 資料處理

pandas中資料可以分為series,dataframe,panel分別表示一維至三維資料。其中在構造時,index表示行名,columns表示列名 構造方式 s pd.series data index index s pd series np random randn 5 index a b ...

pandas資料處理

dataframe.duplicated subset none,keep first 判斷dataframe中的資料是否有重複 必須一行中所有資料都重複才算重複,只能判斷行,不能判斷列 返回series dataframe.drop duplicates subset none,keep firs...

Pandas資料處理

資料處理 pandas from sklearn.preprocessing import minmaxscaler data 1,2 0.5,6 0.10 1,18 將 numpy 轉換成 pd 表 pd.dataframe data 歸一化 0,1 之間 scaler minmaxscaler ...