【问题标题】:drop function cause KeyError on dataframe删除函数导致数据帧上的 KeyError
【发布时间】:2021-04-01 17:14:38
【问题描述】:

在 testColumn 函数中(查看完整代码),当我使用 drop 删除数据框中的一列时,它会抛出一个我不明白的键错误

完成 drop 后,我可以显示我的数据框,drop 函数可以工作,但会导致以下错误

#...in testColumn ----
xtrain = X_train.drop([c], axis=1)
xtest = X_test.drop([c], axis=1)
#...

但是如果我写这个我没有错误:

#...in testColumn ---
xtrain = X_train
xtest = X_test
#...

为什么?


import pandas as pd

def euclidian_distance(v1, v2):
    distance = 0
    for i in range(v1.shape[0]):
        distance += (v1[i] - v2[i]) ** 2
    return np.sqrt(distance)


def neighbors(X_train, y_label, x_test, k):
    list_distances = []

    for i in range(X_train.shape[0]):
        distance = euclidian_distance(X_train.iloc[i], x_test)

        list_distances.append(distance)

    df = pd.DataFrame()

    df["label"] = y_label
    df["distance"] = list_distances

    df = df.sort_values(by="distance")

    return df.iloc[:k, :]


def prediction(neighbors):
    return neighbors['label'].mode()

def testColumn(X_train, Y_train, X_test, Y_test, k):
    les_taux = []
    for c in range(X_train.shape[1]):
        xtrain = X_train.drop([c], axis=1)
        xtest = X_test.drop([c], axis=1)
        print(xtrain)
        succes = 0
        for i in range(xtest.shape[0]):
            res = prediction(neighbors(xtrain, Y_train, xtest.iloc[8], k))
            if res == Y_test.iloc[i]:
                succes += 1
        taux_succes = (succes / xtest.shape[0])
        les_taux.append(taux_succes)
    return les_taux

** 错误输出:**

Traceback (most recent call last):
  File "/home/etudiant/phython/CompetitionMachineLearning/venv/lib/python3.9/site-packages/pandas/core/indexes/base.py", line 3080, in get_loc
    return self._engine.get_loc(casted_key)
  File "pandas/_libs/index.pyx", line 70, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 101, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1625, in pandas._libs.hashtable.Int64HashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1632, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 0

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/etudiant/phython/CompetitionMachineLearning/knn.py", line 123, in <module>
    les_taux, c = testColumn(Xt_train, Yt_train, Xt_test, Yt_test, 1)
  File "/home/etudiant/phython/CompetitionMachineLearning/knn.py", line 83, in testColumn
    res = prediction(neighbors(xtrain, Y_train, xtest.iloc[8], k))
  File "/home/etudiant/phython/CompetitionMachineLearning/knn.py", line 35, in neighbors
    distance = euclidian_distance(X_train.iloc[i], x_test)
  File "/home/etudiant/phython/CompetitionMachineLearning/knn.py", line 20, in euclidian_distance
    distance += (v1[i] - v2[i]) ** 2
  File "/home/etudiant/phython/CompetitionMachineLearning/venv/lib/python3.9/site-packages/pandas/core/series.py", line 853, in __getitem__
    return self._get_value(key)
  File "/home/etudiant/phython/CompetitionMachineLearning/venv/lib/python3.9/site-packages/pandas/core/series.py", line 961, in _get_value
    loc = self.index.get_loc(label)
  File "/home/etudiant/phython/CompetitionMachineLearning/venv/lib/python3.9/site-packages/pandas/core/indexes/base.py", line 3082, in get_loc
    raise KeyError(key) from err
KeyError: 0

更新 j'ai mis la fonction à jour comme ceci :

def testColumn(X_train, Y_train, X_test, Y_test, k):
    les_taux = []
    for c in X_train.columns:
        xtrain = X_train.drop([c], axis=1)
        xtest = X_test.drop([c], axis=1)
        print(xtrain)#works
        print(xtest)#works
        succes = 0
        for i in range(xtest.shape[0]):
            res = prediction(neighbors(xtrain, Y_train, xtest.iloc[i], k))
            if res == Y_test.iloc[i]:
                succes += 1
        taux_succes = (succes / xtest.shape[0])
        les_taux.append(taux_succes)
    return les_taux

为了检查 drop 是否正常,我在删除正确完成的数据框列后直接进行了显示,但是当我删除 行删除它工作的列。

新的错误输出(看起来和上面一样):

Traceback (most recent call last):
  File "/home/etudiant/phython/CompetitionMachineLearning/venv/lib/python3.9/site-packages/pandas/core/indexes/base.py", line 3080, in get_loc
    return self._engine.get_loc(casted_key)
  File "pandas/_libs/index.pyx", line 70, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 101, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1625, in pandas._libs.hashtable.Int64HashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1632, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 0

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/etudiant/phython/CompetitionMachineLearning/knn.py", line 123, in <module>
    les_taux = testColumn(Xt_train, Yt_train, Xt_test, Yt_test, 1)
  File "/home/etudiant/phython/CompetitionMachineLearning/knn.py", line 83, in testColumn
    res = prediction(neighbors(xtrain, Y_train, xtest.iloc[i], k))
  File "/home/etudiant/phython/CompetitionMachineLearning/knn.py", line 35, in neighbors
    distance = euclidian_distance(X_train.iloc[i], x_test)
  File "/home/etudiant/phython/CompetitionMachineLearning/knn.py", line 20, in euclidian_distance
    distance += (v1[i] - v2[i]) ** 2
  File "/home/etudiant/phython/CompetitionMachineLearning/venv/lib/python3.9/site-packages/pandas/core/series.py", line 853, in __getitem__
    return self._get_value(key)
  File "/home/etudiant/phython/CompetitionMachineLearning/venv/lib/python3.9/site-packages/pandas/core/series.py", line 961, in _get_value
    loc = self.index.get_loc(label)
  File "/home/etudiant/phython/CompetitionMachineLearning/venv/lib/python3.9/site-packages/pandas/core/indexes/base.py", line 3082, in get_loc
    raise KeyError(key) from err
KeyError: 0

Process finished with exit code 1

【问题讨论】:

  • 因为 drop 会根据 标签名称 删除,并且您没有列 named 0。您可以插入:X_train.drop(X_train.columns[c], axis=1),因为c 似乎是一个数组位置索引。
  • 它总是给我同样的错误:(
  • add columns=['c'] instead of [c]xtrain = X_train.drop(columns = ['c'], axis=1)

标签: python-3.x pandas dataframe


【解决方案1】:

一般来说,DataFrame KeyError 表示该行或列不存在:

  • 检查是否有前导/尾随空格(读取文件时经常发生这种情况)

    print(df.columns)
    # Index(['Name', 'City '], dtype='object')
    #                     ^
    
    df.loc[:, 'City']
    # KeyError: 'City'
    
  • 检查方法是否需要索引 name 或索引 number(一些方法如 drop() 需要名称,而其他方法需要数字)

    df.drop(columns=1)
    # KeyError: "[1] not found in axis"
    

在 OP 的情况下,问题在于 c 是一个列号:

# doesn't work
for c in range(X_train.shape[1]): # c = 0, 1, 2, ...
    xtrain = X_train.drop(c, axis=1) # here c is a column number (but supposed to be a name)
    xtest = X_test.drop(c, axis=1)

但是drop() 需要一个列名,所以我们应该迭代实际的列X_train.columns

# works
for c in X_train.columns:
    xtrain = X_train.drop(c, axis=1) # now c is a column name
    xtest = X_test.drop(c, axis=1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 2023-03-16
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多