特征计算 - 遍历求值提速 6 万倍 lambda...if...else(if...else...) +map() 对比 iterrows() - Python代码
Python 進(jìn)行 DataFrame 數(shù)據(jù)處理的過(guò)程中,需要判斷某一列中的值(條件),然后對(duì)其他兩列或三列進(jìn)行求和(均值/最值)等運(yùn)算,并把運(yùn)算結(jié)果存儲(chǔ)在新的一列中。干說(shuō)可能覺得比較暈,我們來(lái)看一個(gè)例子:
下表 data_base 中,預(yù)測(cè)區(qū)間這一列共有 1/2/3/4 類值,現(xiàn)需要生成新列預(yù)測(cè)概率,新列的計(jì)算規(guī)則為:
- 若預(yù)測(cè)區(qū)間=1,則求分類概率_1與分類概率_2的均值;
- 若預(yù)測(cè)區(qū)間=2/3,則求分類概率_1與分類概率_2與分類概率_3的均值;
- 若預(yù)測(cè)區(qū)間=4,則為分類概率_1的值;
?需求應(yīng)該說(shuō)清楚了,下面我們來(lái)看看根據(jù)上述計(jì)算規(guī)則,傳統(tǒng)的代碼怎么寫。
傳統(tǒng)代碼思路:
iterrows() 遍歷?data_base 表,使用 for ... if ... elif ...計(jì)算預(yù)測(cè)概率的值,
import time start_1 =time.clock()#記錄代碼開始運(yùn)行時(shí)間data_base[u'預(yù)測(cè)概率_1'] = 0#賦初始值for index,row in data_base.iterrows():if (row['預(yù)測(cè)區(qū)間'] == 1):data_base.loc[index, '預(yù)測(cè)概率_1'] = ((data_base.loc[index, '分類概率_1'] + data_base.loc[index, '分類概率_2'])/2).astype(float)elif (row['預(yù)測(cè)區(qū)間'] == 2) | (row['預(yù)測(cè)區(qū)間'] == 3):data_base.loc[index, '預(yù)測(cè)概率_1'] = ((data_base.loc[index, '分類概率_1'] + data_base.loc[index, '分類概率_2']+data_base.loc[index, '分類概率_3'])/3).astype(float)elif (row['預(yù)測(cè)區(qū)間'] == 4):data_base.loc[index, '預(yù)測(cè)概率_1'] = ((data_base.loc[index, '分類概率_1'])).astype(float)end_1 = time.clock()#記錄代碼結(jié)束運(yùn)行時(shí)間 print('Running time: %s Seconds'%(end_1-start_1))#輸出耗時(shí)輸出:Running time: 539.8234579883166 Seconds
?一萬(wàn)四千行數(shù)據(jù),運(yùn)行了將近十分鐘...........
下面來(lái)看看比他快 6 萬(wàn)倍的代碼(思路:lambda...if...else(if...else...) 定義計(jì)算規(guī)則,然后使用 map() 函數(shù)做映射):
start_2 =time.clock()a = data_base[u'預(yù)測(cè)區(qū)間'].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=['預(yù)測(cè)概率_2'])#轉(zhuǎn)化成dataframe格式 data_base = pd.concat([data_base, b['預(yù)測(cè)概率_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 萬(wàn)倍嘛!哈哈......)
下面我們看看求的結(jié)果是否一樣,不管代碼快了多少,如果算錯(cuò)了那就沒(méi)有任何意義:
data_base_out = data_base[['級(jí)別', '行業(yè)', '年份', '預(yù)測(cè)區(qū)間','分類概率_1', '分類概率_2', '分類概率_3','預(yù)測(cè)概率_1','預(yù)測(cè)概率_2']] data_base_out.head()對(duì)比后兩列,一致!?
抽查一些值,根據(jù)計(jì)算規(guī)則手動(dòng)算一算 ,對(duì)比表中代碼給出的值,一致!?
完美~~~
?
總結(jié)
以上是生活随笔為你收集整理的特征计算 - 遍历求值提速 6 万倍 lambda...if...else(if...else...) +map() 对比 iterrows() - Python代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苹果企业证书_IOS福利9月15日苹果企
- 下一篇: python自动化安装软件_python