IndexError: индекс кортежа вне диапазона. Доступ к столбцу в определенной строке - PullRequest
0 голосов
/ 26 июня 2018

Я получаю ошибку 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 - это относительно большой пандан 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 - это строка, в которой напечатано «если строка [5] == строка [5]».

Если у кого-либо есть решение конкретной проблемы для решения IndexError, ваша помощь будет принята с благодарностью, или любые комментарии по улучшению кода также будут оценены. Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать, и я свяжусь с вами, как только смогу.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Нет необходимости кодировать логику для идентификации дубликатов самостоятельно; используйте DataFrame.duplicated (основано на столбце 6 с keep=False из того, что, как я понял, вы пытаетесь сделать) вместо

0 голосов
/ 26 июня 2018

iterrows() возвращает не просто строку, как вы ожидаете, но кортеж индекса строки и самой строки. Таким образом, этот кортеж из двух значений не имеет индекса 6, поэтому вы получаете исключение: «индекс кортежа вне диапазона» (обратите внимание на кортеж )

Если вам не нужен индекс строки, вы можете использовать любое имя, лучшее из которых - _, которое является правильным именем переменной и используется в python для пометки переменных, которые вам не нужны. Таким образом, правильный код цикла -

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

Или, если индекс - это просто последовательность целых чисел от 0, вы можете использовать его вместо ct1 и ct2, если вы предполагаете, что ct2 должен быть сброшен в 0 в начале каждого цикла для строки 2 (кстати, нет ct2 = 0 перед этим циклом, что может быть логической ошибкой). Чтобы убедиться, что индекс действительно необходим, я бы рекомендовал перед возвратом использовать команду reset_index (drop = True). В противном случае было бы трудно найти проблему, если бы вы манипулировали данными раньше и нарушали последовательность индексов.

Но на самом деле, если вам нужно только найти повторяющиеся значения (ваш код не делает именно этого, но я не уверен, если это предполагается или логическая ошибка в коде), вы можете использовать pandas drop_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), чтобы не было логических коллизий с дублирующимися индексами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...