域名和网站的区别,2021年网络营销考试题及答案,聊城企业门户网站建设,区域工业互联网平台在使用 Pandas 处理数据时#xff0c;KeyError 是一个常见的问题#xff0c;尤其是在尝试通过索引访问数据时。本文将通过一个实际案例#xff08;使用SKLearn中的MINIST数据集为例#xff09;#xff0c;详细分析 KeyError 的原因#xff0c;并提供解决方法。
1 问题背…在使用 Pandas 处理数据时KeyError 是一个常见的问题尤其是在尝试通过索引访问数据时。本文将通过一个实际案例使用SKLearn中的MINIST数据集为例详细分析 KeyError 的原因并提供解决方法。
1 问题背景
在处理一些数据集的时候我们可能会遇到了一个典型的 KeyError 问题。如sklearn中的开源数据集MNIST是一个包含手写数字的灰度图像数据集每个图像的大小为 28×28 像素数据集通常以 Pandas DataFrame 的形式加载。在尝试访问数据集中的样本时代码抛出了以下错误
KeyError: 0
错误信息表明代码试图通过索引 0 访问数据但 Pandas DataFrame 中没有名为 0 的列。这通常是因为 DataFrame 的索引方式与我们想的不一样。
2 错误分析
在 Pandas 中DataFrame 的索引方式有两种常见的形式 按列名索引通过列名访问数据例如 df[column_name]。 按位置索引通过位置访问数据例如 df.iloc[row_index, column_index]。
在 MNIST 数据集中X 是一个 Pandas DataFrame其索引方式默认为按列名索引。因此当我们尝试使用 X[0] 访问数据时Pandas 会尝试查找名为 0 的列而不是第 0 行。由于 DataFrame 中没有名为 0 的列因此会抛出 KeyError。
3 方法 1将 DataFrame 转换为 NumPy 数组不建议
如果后续操作不需要 Pandas DataFrame 的功能可以直接将 X 转换为 NumPy 数组。这样就可以使用整数索引访问数据。但是慎用因为后续你的代码中可能要用到DataFrame的相关东西所以不建议在这里直接转为numpy。
# 将 DataFrame 转换为 NumPy 数组
X X.to_numpy()# 可视化第 0 个样本
plt.imshow(X[0].reshape(28, 28), cmapgray)
plt.axis(off)
plt.show()
4 方法 2使用 .iloc 访问 DataFrame 的行推荐
为了保留 Pandas DataFrame 的功能可以使用 .iloc 方法来访问行数据。
# 使用 .iloc 访问第 0 行
plt.imshow(X.iloc[0].values.reshape(28, 28), cmapgray)
plt.axis(off)
plt.show()
5 代码示例
以MINIST为例代码如下
# 导入必要的库
import numpy as np
import os
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml# 设置随机种子以确保结果可复现
np.random.seed(42)# 定义数据存储目录
data_dir os.path.join(os.getcwd(), data)# 下载 MNIST 数据集
mnist fetch_openml(mnist_784, parserauto, data_homedata_dir)# 提取特征和标签
X, y mnist.data, mnist.target# 将 DataFrame 转换为 NumPy 数组可选
X X.to_numpy()# 可视化第 0 个样本
plt.imshow(X[0].reshape(28, 28), cmapgray)
plt.axis(off)
plt.show()