DataFrame修改資料太慢

2021-10-01 15:02:20 字數 4251 閱讀 4761

我學習python有一段時間了,但沒做過什麼大的專案,目前在寫畢業**,正在清洗資料。因為之前一直都是能用excel絕不用python,所用在對 dataframe 進行修改的時候,還是傾向乙個乙個的改。

資料庫的檔案不算特別大,在我篩選過後資料大概有20萬個,之前執行的**都挺快的,在改這個資料的時候出現了問題,執行速度太慢了,我跑了乙個多小時都沒跑出來,我才想到了可能是我方法不對。

我使用了工業企業資料庫,要修改行業分類為新的,將乙個四位數的行業**修改為三位數的,大概轉換的內容如下:

為了加快進度,我寫了個特別笨的function來實現

# 函式的功能:將工業企業資料庫的行業**轉換為新的isic code

# 輸入newdata,a為原來**所在列,j為新的**所在列位置

deftranscode

(newdata,a,j)

: m=newdata.shape[0]

for i in

range

(m):

code=

list

(str

(newdata.iloc[i,a]))

if code[0]

=='1'

:if code[1]

=='4'

: newdata.iloc[i, j]

=311

elif code[1]

=='5'

: newdata.iloc[i, j]

=313

elif code[1]

=='6'

: newdata.iloc[i,j]

=314

elif code[1]

=='7'

: newdata.iloc[i, j]

=321

elif code[1]

=='8 '

:if code[2]

=='1'

: newdata.iloc[i, j]

=322

elif code[2]

=='2'

: newdata.iloc[i,j]

=324

elif code[1]

=='9'

: newdata.iloc[i, j]

=323

elif code[0]

=='2'

:if code[1]

=='0'

: newdata.iloc[i,j]

=331

elif code[1]

=='1'

and code[2]

=='3'

: newdata.iloc[i,j]

=332

elif code[1]

=='2'

: newdata.iloc[i,j]

=341

elif code[1]

=='3'

: newdata.iloc[i,j]

=342

elif code[1]

=='6'

: newdata.iloc[i,j]

=351

elif code[1]

=='5'

:if code[1]

=='1'

: newdata.iloc[i, j]

=353

if code[1]

=='2'

: newdata.iloc[i, j]

=354

elif code[1]

=='9'

: newdata.iloc[i, j]

=355

elif code[0]

=='3'

:if code[1]

=='0'

: newdata.iloc[i ,j]

=356

elif code[1]

=='1'

:if code[2]

=='4'

: newdata.iloc[i, j]

=362

elif code[2]

=='5'

: newdata.iloc[i, j]

=361

else

: newdata.iloc[i, j]

=369

elif code[1]

=='2'

: newdata.iloc[i, j]

=371

elif code[1]

=='3'

: newdata.iloc[i,j]

=372

elif code[1]

=='4'

: newdata.iloc[i,j]

=381

elif code[1]

=='6'

: newdata.iloc[i, j]

=385

elif code[1]

=='7'

: newdata.iloc[i, j]

=384

elif code[1]

=='9'

: newdata.iloc[i, j]

=383

elif code[0]

=='4'

:if code[1]

=='0'

or code[1]

=='1'

: newdata.iloc[i, j]

=382

elif code[1]

=='2'

: newdata.iloc[i, j]

=390

return newdata

之前的想法很美好,雖然我方法笨,但總歸沒問題吧,也用了5000個樣本做了測試,是沒問題的。

但是當我用了20萬個資料之後,跑很久也沒結果。

上網搜尋之後發現,我在知乎看到了一篇文章 簡單兩步,大幅提高python資料處理速度

博主測試了效率發現at比iloc快了很多,於是我將上面那個函式裡面的iloc換成了iat,3秒就跑完了

因為使用iloc的**執行速度實在太慢,所以這裡用50個資料做測試

import time

data_slice=newnewdata.iloc[0:

50]t0=time.time(

)transdata1=transcode(data_slice,a=

1,j=11)

print

(time.time(

)-t0)

執行結果為:

之後嘗試將之前的function中的iloc換為iat,命名為transcode2,再次執行

t0=time.time(

)transdata=transcode2(data_slice,a=

1,j=11)

print

(time.time(

)-t0)

執行結果為:

如果需要乙個個修改dataframe,盡量使用at/iat進行索引。

又想到了之前犯的乙個錯,使用了data.iloc[i][j] 進行索引,導致程式執行太慢了,提醒自己要用 data.iloc[i, j] 進行索引。

如果有修改行業**更好的方法,還請大家指點指點!

謝謝!

pandas之DataFrame更改資料的列位置

df 是dataframe物件 獲取df物件標題列表 cols list df 調位置 cols.insert 1 cols.pop cols.index 重組df物件排列順序 df df.ix cols ix ix是dataframe索引工具,既可以搜尋單個數值也可以搜尋乙個範圍內的數值,既可以通...

dev c 修改資料

今天看完 linux kernel moduletcp ip 程式設計 中實現ping命令是顯示hello module 的資料報程式後,也完成了試驗現在總結如下 步驟一 在 net core dev.c中增加後門 int eefunction01 struct sk buff 0 這是函式eefu...

游標修改資料

declare updateemtinca rcursor cursor scroll 宣告乙個游標 for select emtincar.id as emtincar id,case when b.yieldtransitstatetype id is null then 3 else b.yi...