我有一个 python 代码,使用 pandas 模块,将 .csv 文件中的数据获取到 pandas 数据框中。然后,我必须将列表中的值与 pandas 数据帧的值进行比较。由于我在列表中定义了一些数据框中不存在的索引,因此我在此处收到错误:
for i in sorted(thresholds.keys()):
current=acme_current_data.loc[i, 'Recent-Server']
KeyError:u'标签 [422] 不在 [索引] 中
我需要您的帮助来了解如何在继续之前检查使用的索引是否存在以避免错误。在我的情况下,索引数据帧或检查长度并不是有用的解决方案。
我尝试过类似的方法,但它们不起作用:
for i in sorted(thresholds.keys()):
if acme_current_data.loc[i, 'Recent-Server']:
current=acme_current_data.loc[i, 'Recent-Server']
或者:
for i in sorted(thresholds.keys()):
try:
current=acme_current_data.loc[i, 'Recent-Server']
except INDEX_ERROR:
print "Error"
提前致谢。
这里我给你一个完整的例子(简化的)来看看错误。首先,必须制作一个 source.csv 文件,其中包含要处理的内容。:
INVITE,Requests,60,77340232,13674,59,74062475,13504
Retransmissions,0,5387,34,0,114838,2474
100,Trying,57,77039746,13590,59,73752071,13420
180,Ringing,47,37411523,7067,41,36984407,6982
486,Busy Here,2,3689189,819,2,3689238,819
487,Terminated,13,21531195,3687,13,21531766,3687
488,Not Acceptable,0,39326,24,0,30665,22
491,Req Pending,0,121,4,0,118,4
4xx,Client Error,0,1,1,0,1,1
然后,一个包含此文本下代码的 test.py。如果我有办法在使用 current=current_data.loc[i, 'Recent-Server'] 分配之前检查
,我的问题就解决了。有什么建议吗?current_data.loc[i, 'Recent-Server']
是否存在
import os, sys
import pandas as pd
def compare(name,current_data,thresholds):
reference=current_data.loc['INVITE','Recent-Server']
# Check if we have INVITES events
if reference == '0':
print "{}: critical status".format(name)
return
for i in sorted(thresholds.keys()):
try:
current=current_data.loc[i, 'Recent-Server']
if current != '0':
valor=thresholds[i]
except IndexError:
print "Index Error"
clear="source.csv"
current = pd.read_csv(clear, names=['Message','Event','Recent-Server','Total-Server','PerMax-Server','Recent-Client','Total-Client','PerMax-Client'])
current.set_index("Message", inplace=True)
responses_all=("100", "180", "181", "182", "183", "200", "5xx")
# Thresholds for each event type
thresholds_mia={
responses_all[0]: ["value1"], #100 Trying
responses_all[1]: ["value2"], #180 Ringing
responses_all[2]: ["value3"], #181 Forwarded
responses_all[3]: ["value4"], #182 Queued
responses_all[4]: ["value5"], #183 Progress
responses_all[5]: ["value6"], #200 OK
responses_all[6]: ["value7"] #5xx Server Error
}
# Main
compare("Name",current,thresholds_mia)
最佳答案
感谢您提供完整的代码示例,这非常有帮助。我在评论中提出的两条建议都有效:
选项 1:使用正确的异常
如果您将代码中的 except IndexError
替换为 except KeyError
,您的代码将打印“Index Error”五次。有问题的片段:
for i in sorted(thresholds.keys()):
try:
current = current_data.loc[i, 'Recent-Server']
if current != '0':
valor = thresholds[i]
except KeyError: # <------------------------ use the right exception
print("Index Error")
选项 2:访问前检查成员资格索引
或者,您可以在访问之前检查数据帧的索引,如下所示:
for i in sorted(thresholds.keys()):
if i in current_data.index:
current = current_data.loc[i, 'Recent-Server']
if current != '0':
valor = thresholds[i]
请注意,我在 current_data.index 中检查了数据帧的索引i
。您尝试的(i in current_data.loc.index
)是一个语法错误,因为它不是 loc
具有索引,而是数据帧 current_data
本身。
这两种技术都有效。我更喜欢#2。
关于Python 与 Pandas - KeyError : u'the label [422] is not in the [index],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49887707/