【发布时间】: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会根据 标签名称 删除,并且您没有列 named0。您可以插入: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