我學習python有一段時間了,但沒做過什麼大的專案,目前在寫畢業**,正在清洗資料。因為之前一直都是能用excel絕不用python,所用在對 dataframe 進行修改的時候,還是傾向乙個乙個的改。
資料庫的檔案不算特別大,在我篩選過後資料大概有20萬個,之前執行的**都挺快的,在改這個資料的時候出現了問題,執行速度太慢了,我跑了乙個多小時都沒跑出來,我才想到了可能是我方法不對。
我使用了工業企業資料庫,要修改行業分類為新的,將乙個四位數的行業**修改為三位數的,大概轉換的內容如下:
為了加快進度,我寫了個特別笨的function來實現
之前的想法很美好,雖然我方法笨,但總歸沒問題吧,也用了5000個樣本做了測試,是沒問題的。# 函式的功能:將工業企業資料庫的行業**轉換為新的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
但是當我用了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)
(time.time(
)-t0)
之後嘗試將之前的function中的iloc換為iat,命名為transcode2,再次執行
執行結果為:t0=time.time(
)transdata=transcode2(data_slice,a=
1,j=11)
(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...