首页 > 解决方案 > IndexError:元组索引超出范围。访问特定行中的列

问题描述

我遇到了无法修复的 IndexError 问题。我想要做的是遍历数据行并将一行中的特定列与不同行中的同一列进行比较。如果它们相同,则应将它们放入 badBucket 中,否则将放入 goodBucket 中。

这是我的代码:

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 DataFrame,有 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]”的行。

如果有人对手头的特定问题有解决 IndexError 的解决方案,将不胜感激您的帮助,或者对改进代码的任何评论也将不胜感激。如果您有任何问题,请告诉我,我会尽快回复您。

标签: pythonpandasfor-loopinttypeerror

解决方案


iterrows()不仅返回您期望的一行,还返回行索引和行本身的元组。所以这个两个值的元组没有索引 6,所以你得到 Exception: "tuple index out of range" (注意tuple

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

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

或者,如果索引只是从 0 开始的整数序列,则可以使用它而不是 ct1 和 ct2 如果您假设 ct2 应该在 row2 的每个循环开始时重置为 0(顺便说一下,ct2 = 0在此循环之前没有可能是逻辑错误)。为了确保索引真的很需要,我建议在循环之前强制 reset_index(drop=True) 。否则,如果您之前操作数据并破坏索引序列,将很难发现问题。

但实际上,如果您只需要查找重复值(您的代码并没有完全做到这一点,但我不确定这是假设的还是代码中的逻辑错误),您可以使用 pandasdrop_duplicates来为您完成所有工作。所以我们可以创建列“唯一”并为那些没有被删除为重复的索引设置 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)确保不会与重复索引发生逻辑冲突。


推荐阅读