Python代码报KeyError: 'iris'错误求修复,已确认文件路径正确
修复KeyError: 'iris'问题
问题概述
运行Lab 5.py代码时触发KeyError: 'iris',已确认iris.csv与代码文件在同一目录,需修复该错误并确保代码正常运行。
错误追踪信息
Traceback (most recent call last): File "C:\Users\kyle_\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pandas\core\indexes\base.py", line 3800, in get_loc return self._engine.get_loc(casted_key) File "pandas\_libs\index.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc File "pandas\_libs\index.pyx", line 165, in pandas._libs.index.IndexEngine.get_loc File "pandas\_libs\hashtable_class_helper.pxi", line 5745, in pandas._libs.hashtable.PyObjectHashTable.get_item File "pandas\_libs\hashtable_class_helper.pxi", line 5753, in pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: 'iris' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\kyle_\OneDrive\Documents\COIS 4400H\Lab 5.py", line 23, in <module> iris_df['iris'].drop_duplicates() File "C:\Users\kyle_\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pandas\core\frame.py", line 3805, in __getitem__ indexer = self.columns.get_loc(key) File "C:\Users\kyle_\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pandas\core\indexes\base.py", line 3802, in get_loc raise KeyError(key) from err KeyError: 'iris' >>>
用户代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import datetime as dt import sklearn from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score from scipy.cluster.hierarchy import linkage from scipy.cluster.hierarchy import dendrogram from scipy.cluster.hierarchy import cut_tree import os os.chdir('C:\\Users\kyle_\\OneDrive\\Documents\\COIS 4400H') iris_df = pd.read_csv('iris.csv') iris_df.head() iris_df['iris'].drop_duplicates() iris_df = iris_df.drop('iris',axis=1) scaler = StandardScaler() iris_df_scaled = scaler.fit_transform(iris_df) iris_df_scaled.shape sse = [] range_n_clusters = [2, 3, 4, 5, 6, 7, 8 , 9 , 10 ] for num_clusters in range_n_clusters: kmeans = KMeans(n_clusters=num_clusters, max_iter=50) kmeans.fit(iris_df_scaled) sse.append(kmeans.inertia_) plt.plot(sse) # 1. Kmeans with k=3 kmeans = KMeans(n_clusters=3, max_iter=50) y = kmeans.fit_predict(iris_df_scaled) y iris_df['Label'] = kmeans.labels_ iris_df.head() plt.scatter(iris_df_scaled[y == 0, 0], iris_df_scaled[y == 0, 1], s = 100, c = 'purple', label = 'Iris-setosa') plt.scatter(iris_df_scaled[y == 1, 0], iris_df_scaled[y == 1, 1], s = 100, c = 'orange', label = 'Iris-versicolour') plt.scatter(iris_df_scaled[y == 2, 0], iris_df_scaled[y == 2, 1], s = 100, c = 'green', label = 'Iris-virginica') # 2. Hierarchical clustering plt.figure(figsize=(15, 5)) mergings = linkage(iris_df_scaled,method='complete',metric='euclidean') dendrogram(mergings) plt.show() cluster_hier = cut_tree(mergings,n_clusters=3).reshape(-1) iris_df['Label'] = cluster_hier iris_df.head() plt.scatter(iris_df_scaled[cluster_hier == 0, 0], iris_df_scaled[cluster_hier == 0, 1], s = 100, c = 'purple', label = 'Iris-setosa') plt.scatter(iris_df_scaled[cluster_hier == 1, 0], iris_df_scaled[cluster_hier == 1, 1], s = 100, c = 'orange', label = 'Iris-versicolour') plt.scatter(iris_df_scaled[cluster_hier == 2, 0], iris_df_scaled[cluster_hier == 2, 1], s = 100, c = 'green', label = 'Iris-virginica')
修复方案
1. 定位真实列名
错误核心是代码尝试访问名为'iris'的列,但数据集里不存在这个列。经典鸢尾花数据集的标签列通常叫'species'或'class',在读取数据后添加代码查看真实列名:
iris_df = pd.read_csv('iris.csv') print(iris_df.columns) # 打印所有列名
2. 替换错误列名引用
将代码中所有'iris'替换为真实的标签列名。比如如果真实列名是'species',修改如下:
# 原代码 iris_df['iris'].drop_duplicates() iris_df = iris_df.drop('iris',axis=1) # 修改后 iris_df['species'].drop_duplicates() iris_df = iris_df.drop('species',axis=1)
3. 修正KMeans循环缩进错误
原代码中kmeans.fit()和sse.append()不在for循环块内,导致仅计算最后一个聚类数的SSE,修正缩进并完善绘图:
sse = [] range_n_clusters = [2, 3, 4, 5, 6, 7, 8 , 9 , 10 ] for num_clusters in range_n_clusters: kmeans = KMeans(n_clusters=num_clusters, max_iter=50) kmeans.fit(iris_df_scaled) # 缩进至循环内 sse.append(kmeans.inertia_) # 缩进至循环内 plt.plot(range_n_clusters, sse) # 添加x轴参数,让图表更清晰 plt.xlabel('聚类数') plt.ylabel('SSE') plt.show()
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

