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'
谢谢,会试试看!有一件事......我的错误,两个目标列具有相同的名称,这导致一个单一的msg_code列。已经编辑我的问题。 –
编辑根据您的编辑:) – Kevin
不幸的是,似乎没有itertools我的环境 '[Anaconda3] C:\ Users \ [剪辑]> pip安装itertools 收集itertools 找不到满足要求的版本itertools(来自版本:) 没有找到匹配的发行itertools' –