日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

特征计算 - 遍历求值提速 6 万倍 lambda...if...else(if...else...) +map() 对比 iterrows() - Python代码

發布時間:2024/7/5 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特征计算 - 遍历求值提速 6 万倍 lambda...if...else(if...else...) +map() 对比 iterrows() - Python代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python 進行 DataFrame 數據處理的過程中,需要判斷某一列中的值(條件),然后對其他兩列或三列進行求和(均值/最值)等運算,并把運算結果存儲在新的一列中。干說可能覺得比較暈,我們來看一個例子:

下表 data_base 中,預測區間這一列共有 1/2/3/4 類值,現需要生成新列預測概率,新列的計算規則為:

  • 預測區間=1,則求分類概率_1分類概率_2的均值;
  • 預測區間=2/3,則求分類概率_1分類概率_2分類概率_3的均值;
  • 預測區間=4,則為分類概率_1的值;

?需求應該說清楚了,下面我們來看看根據上述計算規則,傳統的代碼怎么寫。

傳統代碼思路:

iterrows() 遍歷?data_base 表,使用 for ... if ... elif ...計算預測概率的值,

import time start_1 =time.clock()#記錄代碼開始運行時間data_base[u'預測概率_1'] = 0#賦初始值for index,row in data_base.iterrows():if (row['預測區間'] == 1):data_base.loc[index, '預測概率_1'] = ((data_base.loc[index, '分類概率_1'] + data_base.loc[index, '分類概率_2'])/2).astype(float)elif (row['預測區間'] == 2) | (row['預測區間'] == 3):data_base.loc[index, '預測概率_1'] = ((data_base.loc[index, '分類概率_1'] + data_base.loc[index, '分類概率_2']+data_base.loc[index, '分類概率_3'])/3).astype(float)elif (row['預測區間'] == 4):data_base.loc[index, '預測概率_1'] = ((data_base.loc[index, '分類概率_1'])).astype(float)end_1 = time.clock()#記錄代碼結束運行時間 print('Running time: %s Seconds'%(end_1-start_1))#輸出耗時

輸出:Running time: 539.8234579883166 Seconds

?一萬四千行數據,運行了將近十分鐘...........


下面來看看比他快 6 萬倍的代碼(思路:lambda...if...else(if...else...) 定義計算規則,然后使用 map() 函數做映射):

start_2 =time.clock()a = data_base[u'預測區間'].tolist() x = data_base[u'分類概率_1'].tolist() y = data_base[u'分類概率_2'].tolist() z = data_base[u'分類概率_3'].tolist()b = list(map(lambda a, x, y, z: (x+y+z)/3 if (a==2)|(a==3) else ((x+y)/2 if a==1 else(x if a==4 else 0)),a, x, y, z)) b = pd.DataFrame(b, columns=['預測概率_2'])#轉化成dataframe格式 data_base = pd.concat([data_base, b['預測概率_2']], axis = 1, join='outer', sort=False)end_2 = time.clock() print('Running time: %s Seconds'%(end_2-start_2))

輸出:Running time: 0.009003164524415297 Seconds

539.823?/ 0.009 ~~ 60000 (這可不就是快了 6 萬倍嘛!哈哈......)


下面我們看看求的結果是否一樣,不管代碼快了多少,如果算錯了那就沒有任何意義:

data_base_out = data_base[['級別', '行業', '年份', '預測區間','分類概率_1', '分類概率_2', '分類概率_3','預測概率_1','預測概率_2']] data_base_out.head()

對比后兩列,一致!?

抽查一些值,根據計算規則手動算一算 ,對比表中代碼給出的值,一致!?

完美~~~


?

總結

以上是生活随笔為你收集整理的特征计算 - 遍历求值提速 6 万倍 lambda...if...else(if...else...) +map() 对比 iterrows() - Python代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。