Python 与 Pandas - KeyError : u'the label [422] is not in the [index]

标签 python pandas

我有一个 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/

相关文章:

python - 混合 xml/文本解析 python

python - MultiGPU Kmeans 聚类与 RAPIDs 卡住

python - Pandas 用字典中的值替换部分字符串

python - 将元组列表转换为切片列表以与 np.r_ 一起使用

Pandas:DataFrame 中的 DataFrame

python - "list index out of range"异常(Python3)

python - 有人可以给出一个在 github 中上传发布 Assets 的 python 请求示例吗?

python - Flask:获取当前路线

python - pydantic @validate_arguments 非内置类型(如 pandas DataFrame)的最佳实践

python - 读取多个数据时,根据列变量将提取的单元格(iloc)循环到列表中