簡體   English   中英

IndexError:元組索引超出范圍。 訪問特定行中的列

[英]IndexError: tuple index out of range. Accessing column in specific row

我遇到了無法修復的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是具有6列(0,1,2,3,4,5,6)的相對較大的pandas DataFrame。

我的錯誤是:

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的手頭有特定的解決方案,將不勝感激,或者對改進代碼的任何評論也將不勝感激。 如果您有任何疑問,請告訴我,我們會盡快與您聯系。

iterrows()返回預期的行,還返回行索引和行本身的元組。 因此,這兩個值的元組沒有索引6,因此您會得到異常:“ tuple index out of range”(注意tuple

如果不需要行索引,則可以使用任何名稱,最好的名稱是_,它是正確的變量名,它在python中用於標記不需要的變量。 所以正確的循環代碼是

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

或者,如果索引只是一個從0開始的整數序列,則可以使用它而不是ct1和ct2,前提是假設在row2的每個循環開始時ct2應該重置為0(順便說一句,之前ct2 = 0此循環,這可能是邏輯錯誤)。 為了確保索引確實符合需要,我建議在循環之前強制使用reset_index(drop = True)。 否則,如果您之前要處理數據並破壞索引序列,將很難發現問題。

但是實際上,如果您只需要查找重復的值(您的代碼沒有完全做到這一點,但是我不確定這是假定的還是代碼中的邏輯錯誤),則可以使用pandas 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)來確保重復索引不會發生邏輯沖突。

無需自己編寫用於識別重復項的邏輯代碼; 改用DataFrame.duplicated (根據我收集的內容在第6列中使用keep=False預測)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM