我收到以下错误:'DataFrame' 对象没有属性'data'

数据挖掘 Python 熊猫 数据框 CSV
2021-09-27 15:48:21

我正在尝试获取 iris setosa 数据库的“数据”和“目标”,但我不能。例如,当我直接从 sklearn 数据集加载 iris setosa 时,我得到了一个很好的结果:

程序:

from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target
print('Class labels:', np.unique(y))

输出:

Class labels: [0 1 2]

但是,如果我尝试直接从扩展名 '.csv'加载它,我会收到以下错误:

程序:

import pandas as pd

iris = pd.read_csv('iris.csv', header=None).iloc[:,2:4]

x = iris.data
y = iris.target

输出:

'DataFrame' object has no attribute 'data'

为什么会这样?

4个回答

“sklearn.datasets”是一个 scikit 包,其中包含一个方法 load_iris()。

load_iris(),默认返回一个包含数据、目标和其他成员的对象。为了获得实际值,您必须读取数据和目标内容本身。

而“iris.csv”将特征和目标放在一起。

仅供参考:如果您load_iris()中将 return_X_y 设置为 True,那么您将直接获得特征和目标。

from sklearn import datasets
data,target = datasets.load_iris(return_X_y=True)

Sklearn 的 Iris 数据集采用 Sklearn 的Bunch格式:

print(type(iris))
print(iris.keys())

输出:

<class 'sklearn.utils.Bunch'>
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

所以,这就是为什么你可以访问它:

x=iris.data
y=iris.target

但是,当您将 CSV 文件读取为您提到的 DataFrame 时:

iris = pd.read_csv('iris.csv',header=None).iloc[:,2:4]
iris.head()

输出是:

    2   3
0   petal_length    petal_width
1   1.4 0.2
2   1.4 0.2
3   1.3 0.2
4   1.5 0.2

这里的列名是“1”和“2”。

首先,您应该将 CSV 文件读取为:

df = pd.read_csv('iris.csv')

您不应包含header=None,因为您的 csv 文件包含列名,即标题。

所以,现在你可以做的是这样的:

X = df.iloc[:, [2, 3]] # Will give you columns 2 and 3 i.e 'petal_length' and 'petal_width'
y = df.iloc[:, 4] # Label column i.e 'species'

或者如果你想使用列名,那么:

X = df[['petal_length', 'petal_width']]
y = df.iloc['species']

此外,如果要将标签从字符串转换为数字格式,请使用 sklearn LabelEncoder

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
y = le.fit_transform(y)

如果您的第二个代码片段程序在您运行第一个代码片段程序的同一个内核上运行(继续),那么您将收到此错误,因为数据集iris是您预先定义的并且data已经内置了由 Scikit-Learn 提供的方法。

在处理专用CSV文件时,Pandas有不同的方法可供您使用,例如:

#To show all data(https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.all.html), use:
iris.all

#To get results that you expected, use df.columns (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.columns.html):
x = iris[iris.columns[0]]
y = iris[iris.columns[1]]

请确认您的程序是否获取此错误或单独的内核。或者,如果此解决方案符合您的要求,您可以选择将此标记为其他学习者的答案,以便在有疑问时从中受益。

当我们直接从 sklearn 数据集加载虹膜数据时,我们不必担心为数据和目标分割列,因为 sklearn 本身会以我们可以用来直接输入模型的方式组织数据。

但是当我们从 csv 文件中加载数据时,我们必须根据需要对列进行切片并以某种方式组织它,以便可以将其输入到模型中。read_csv当您在使用熊猫读取 csv 文件后执行以下行时

x=iris.data
y=iris.target

您实际上指的是熊猫数据框的属性,而不是 sklearn 中的实际数据和目标列值。如果数据集中存在列值,则必须使用 iris['data']、iris['target'] 访问列值。