代码之家  ›  专栏  ›  技术社区  ›  Fletchy1995

索引器错误:元组索引超出范围。访问特定行中的列

  •  0
  • Fletchy1995  · 技术社区  · 7 年前

    我遇到一个索引器问题,无法修复。我要做的是遍历数据行,并将一行中的特定列与另一行中的同一列进行比较。如果它们是一样的,它应该把它们放在坏桶里,否则它会变成好桶。

    这是我的代码:

    XDFDF =pd.DataFrame(XDF)
    ct1 = 0
    ct2 = 0
    goodBucket = []
    badBucket = []
    duplicate = False
    for row in XDFDF.iterrows():
        for row2 in XDFDF.iterrows():
            if ct1 != ct2:
                if row[6] == row2[6]:
                    badBucket.append(row2)
                    duplicate = True
                else:
                    goodBucket.append(row2)
            ct2 += 1
        if duplicate:
            badBucket.append(row)
            duplicate = False
        ct1 += 1
    

    注:xdfdf是一个相对较大的pandas数据帧,有6列(0,1,2,3,4,5,6)。

    我的错误是:

    Traceback (most recent call last):
      File "/Users/john_crowley/PycharmProjects/Greatness/venv/Recipes.py", line 118, in <module>
        if row[6] == row2[6]:
    IndexError: tuple index out of range
    
    Process finished with exit code 1
    

    注意:第118行是键入“if row[5]==row[5]”的行。

    如果有人有一个具体问题的解决方案在手边解决索引器您的帮助将不胜感激,或任何关于改进代码的意见也将不胜感激。如果您有任何问题,请告诉我,我会尽快给您答复。

    2 回复  |  直到 7 年前
        1
  •  1
  •   deepyaman    7 年前

    不需要自己编写识别重复项的逻辑代码;使用 DataFrame.duplicated (以第6列为前提 keep=False 据我所知你想做的)相反。

        2
  •  2
  •   Leonid Mednikov    7 年前

    iterrows() 不仅返回您期望的行,还返回行索引和行本身的元组。所以这两个值的元组没有索引6,所以出现异常:“元组索引超出范围”(注意 元组 )

    如果不需要行索引,可以使用任何名称,最好的名称是u,这是一个正确的变量名,在python中用于标记不需要的变量。所以正确的循环代码是

    for _, row in XDFDF.iterrows():
        for _, row2 in XDFDF.iterrows():
    

    或者如果索引只是从0开始的一个整数序列,如果假设在第2行的每个循环开始时CT2应该重置为0,则可以使用它而不是CT1和CT2(顺便说一句 ct2 = 0 在这个可能是逻辑错误的循环之前)。为了确保索引与实际需要的一样,我建议在循环之前强制重置索引(drop=true)。否则,如果在操作之前使用数据并中断索引序列,将很难找到问题。

    但事实上,如果您只需要找到重复的值(您的代码并没有这样做,但我不确定这是否是假定的,或者代码中存在逻辑错误),那么您可以使用panda drop_duplicates 这将为你做所有的工作。因此,我们可以创建列“unique”,并为那些没有作为重复项删除的索引设置true

    XDFDF["unique"] = False
    indexes_of_unique = XDFDF.loc[:, 6].drop_duplicates(keep=False).index
    XDFDF.loc[indexes_of_unique, "unique"] = True
    

    这部分是最重要的 XDFDF.loc[:, 6].drop_duplicates(keep=False).index 是的。它获取列6,删除重复值(默认情况下,它保留一个重复值,但keep=false强制删除所有具有重复值的值)。所以现在我们有了唯一值的索引,我们可以标记它们。重要的是,熊猫的索引不能保证是唯一的,所以我建议 XDFDF.reset_index(drop=True, inplace=True) 以确保不会与重复索引发生逻辑冲突。

    推荐文章