2016-02-12 102 views
3

我剛開始探討Python,雖然我很興奮,似乎我遠離pythonian的想法。熊貓DataFrame適用()ValueError:太多的值解壓(預計2)

下面是一個方法的例子,它有一個字'suboptimal'全。 儘管這對於我的相對較小的數據集來說已經足夠,但我想知道如何以更好的方式編寫它?

import pandas as pd 
from pandas import DataFrame 

# create sample log data frame 
lg = pd.DataFrame(['Access violation at address 00A97...', 
        'Try to edit the splines or change...', 
        'Access violation at address 00F2B...', 
        'Please make sure the main electro...'], columns=['lg_msg']) 

# define message classification 
err_messages = [['Access violation', 'ACC-VIOL', 'PROG'], 
       ['Please make sure th', 'ELE-NOT-PLACED', 'MOD'], 
       ['Try to edit the splines', 'TRY-EDIT-SPLINES', 'MOD']]     

# lookup code 
def message_code(msg_text): 
    for msg in err_messages: 
     if msg_text.startswith(msg[0]): 
      return msg[1] 
    return '' 

# lookup type 
def message_type(msg_text): 
    for msg in err_messages: 
     if msg_text.startswith(msg[0]): 
      return msg[2] 
    return ''    

lg['msg_code'] = lg['lg_msg'].apply(lambda x: message_code(x)) 
lg['msg_type'] = lg['lg_msg'].apply(lambda x: message_type(x)) 

我試圖創建一個函數來計算日誌條目的代碼,並在一次鍵入:

def message_code_type(msg_text): 
    for msg in err_messages: 
     if msg_text.startswith(msg[0]): 
      return (msg[1], msg[2]) 
    return ('', '') 

lg['msg_code'], lg['msg_type'] = lg['lg_msg'].apply(lambda x: message_code_type(x)) 

但得到:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-18-72f97d857539> in <module>() 
----> 1 lg['msg_code'], lg['msg_code'] = lg['lg_msg'].apply(lambda x: message_code_type(x)) 

ValueError: too many values to unpack (expected 2) 

有什麼辦法不遍歷數據框兩次?

任何反饋將不勝感激。

import sys 
print(sys.version) 
3.5.1 |Anaconda 2.4.0 (64-bit)| (default, Jan 29 2016, 15:01:46) [MSC v.1900 64 bit (AMD64)] 

pd.__version__ 
'0.17.1' 

回答

6

嘗試這種使用izip從itertools模塊裏:

from itertools import izip 
lg['msg_code'], lg['msg_code'] = izip(*lg['lg_msg'].apply(lambda x: message_code_type(x))) 

In [21]: lg 
Out[21]: 
    lg_msg msg_code 
0 Access violation at address 00A97... PROG 
1 Try to edit the splines or change... MOD 
2 Access violation at address 00F2B... PROG 
3 Please make sure the main electro... MOD 

對不起,這就是2.7,你應該只能夠使用內置zip

lg['msg_code'], lg['msg_type'] = zip(*lg['lg_msg'].apply(lambda x: message_code_type(x))) 

    lg_msg msg_code msg_type 
0 Access violation at address 00A97... ACC-VIOL PROG 
1 Try to edit the splines or change... TRY-EDIT-SPLINES MOD 
2 Access violation at address 00F2B... ACC-VIOL PROG 
3 Please make sure the main electro... ELE-NOT-PLACED MOD 
+0

謝謝,會試試看!有一件事......我的錯誤,兩個目標列具有相同的名稱,這導致一個單一的msg_code列。已經編輯我的問題。 –

+0

編輯根據您的編輯:) – Kevin

+0

不幸的是,似乎沒有itertools我的環境 '[Anaconda3] C:\ Users \ [剪輯]> pip安裝itertools 收集itertools 找不到滿足要求的版本itertools(來自版本:) 沒有找到匹配的發行itertools' –

相關問題