如何将 Scikit-learn 数据集转换为 Pandas 数据集
How to convert a Scikit-learn dataset to a Pandas dataset
如何将数据从 Scikit-learn Bunch 对象转换为 Pandas DataFrame?
from sklearn.datasets import load_iris
import pandas as pd
data = load_iris()
print(type(data))
data1 = pd. # Is there a Pandas method to accomplish this?
您可以手动使用 pd.DataFrame
构造函数,给出一个 numpy 数组 (data
) 和一个列名列表 (columns
)。
要将所有内容都放在一个 DataFrame 中,您可以使用 np.c_[...]
(注意 []
)将特征和目标连接到一个 numpy 数组中:
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
# save load_iris() sklearn dataset to iris
# if you'd like to check dataset type use: type(load_iris())
# if you'd like to view list of attributes use: dir(load_iris())
iris = load_iris()
# np.c_ is the numpy concatenate function
# which is used to concat iris['data'] and iris['target'] arrays
# for pandas column argument: concat iris['feature_names'] list
# and string list (in this case one string); you can make this anything you'd like..
# the original dataset would probably call this ['Species']
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
可能有更好的方法,但这是我过去所做的并且效果很好:
items = data.items() #Gets all the data from this Bunch - a huge list
mydata = pd.DataFrame(items[1][1]) #Gets the Attributes
mydata[len(mydata.columns)] = items[2][1] #Adds a column for the Target Variable
mydata.columns = items[-1][1] + [items[2][0]] #Gets the column names and updates the dataframe
现在 mydata 将拥有您需要的一切 - 属性、目标变量和列名
from sklearn.datasets import load_iris
import pandas as pd
data = load_iris()
df = pd.DataFrame(data=data.data, columns=data.feature_names)
df.head()
可能对本教程感兴趣:http://www.neural.cz/dataset-exploration-boston-house-pricing.html
找出最佳答案并解决我的评论,这是一个转换函数
def bunch_to_dataframe(bunch):
fnames = bunch.feature_names
features = fnames.tolist() if isinstance(fnames, np.ndarray) else fnames
features += ['target']
return pd.DataFrame(data= np.c_[bunch['data'], bunch['target']],
columns=features)
这对我有用。
dataFrame = pd.dataFrame(data = np.c_[ [iris['data'],iris['target'] ],
columns=iris['feature_names'].tolist() + ['target'])
TOMDLt 的解决方案对于 scikit-learn 中的所有数据集都不够通用。例如,它不适用于波士顿住房数据集。我提出了一个更通用的不同解决方案。也不需要使用 numpy。
from sklearn import datasets
import pandas as pd
boston_data = datasets.load_boston()
df_boston = pd.DataFrame(boston_data.data,columns=boston_data.feature_names)
df_boston['target'] = pd.Series(boston_data.target)
df_boston.head()
作为一般函数:
def sklearn_to_df(sklearn_dataset):
df = pd.DataFrame(sklearn_dataset.data, columns=sklearn_dataset.feature_names)
df['target'] = pd.Series(sklearn_dataset.target)
return df
df_boston = sklearn_to_df(datasets.load_boston())
作为替代方案,我可以更轻松地解决问题:
data = load_iris()
df = pd.DataFrame(data['data'], columns=data['feature_names'])
df['target'] = data['target']
df.head()
基本上不是从一开始就连接起来,而是用特征矩阵制作一个数据框,然后用数据['whatvername']添加目标列并从数据集中获取目标值
我花了 2 个小时才弄明白
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
##iris.keys()
df= pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
取回我的物种 pandas
结合特征和目标变量的其他方法可以使用 np.column_stack
(details)
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
data = load_iris()
df = pd.DataFrame(np.column_stack((data.data, data.target)), columns = data.feature_names+['target'])
print(df.head())
结果:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target
0 5.1 3.5 1.4 0.2 0.0
1 4.9 3.0 1.4 0.2 0.0
2 4.7 3.2 1.3 0.2 0.0
3 4.6 3.1 1.5 0.2 0.0
4 5.0 3.6 1.4 0.2 0.0
如果您需要 target
的字符串标签,则可以通过将 target_names
转换为 dictionary
并添加新列来使用 replace
:
df['label'] = df.target.replace(dict(enumerate(data.target_names)))
print(df.head())
结果:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target label
0 5.1 3.5 1.4 0.2 0.0 setosa
1 4.9 3.0 1.4 0.2 0.0 setosa
2 4.7 3.2 1.3 0.2 0.0 setosa
3 4.6 3.1 1.5 0.2 0.0 setosa
4 5.0 3.6 1.4 0.2 0.0 setosa
此片段仅 syntactic sugar built upon what 已贡献和解释。唯一的区别是 load_iris
将 return 一个元组而不是字典,并且列名被枚举。
df = pd.DataFrame(np.c_[load_iris(return_X_y=True)])
无论 TomDLT 的回答如何,它可能对你们中的某些人不起作用,因为
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
因为 iris['feature_names'] returns 你是一个 numpy 数组。在 numpy 数组中,您不能仅通过 + 运算符添加数组和列表 ['target']。所以你需要先把它转换成一个列表,然后再添加。
你可以做到
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= list(iris['feature_names']) + ['target'])
这会很好用..
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
X = iris['data']
y = iris['target']
iris_df = pd.DataFrame(X, columns = iris['feature_names'])
iris_df.head()
最佳方法之一:
data = pd.DataFrame(digits.data)
Digits 是 sklearn 数据框,我将其转换为 pandas DataFrame
基本上你需要的是 "data",你在 scikit 束中有它,现在你只需要 "target"(预测),它也在束中。
所以只需要将这两个连接起来就可以使数据完整
data_df = pd.DataFrame(cancer.data,columns=cancer.feature_names)
target_df = pd.DataFrame(cancer.target,columns=['target'])
final_df = data_df.join(target_df)
我从你的回答中吸取了一些想法,但我不知道如何缩短:)
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris['feature_names'])
df['target'] = iris['target']
这给出了一个 Pandas DataFrame,其中 feature_names 加上目标作为列和 RangeIndex(start=0, stop=len(df), step=1)。
我想要一个更短的代码,我可以在其中直接添加 'target'。
否则使用 seaborn data sets 这是实际的 pandas 数据帧:
import seaborn
iris = seaborn.load_dataset("iris")
type(iris)
# <class 'pandas.core.frame.DataFrame'>
与scikit learn数据集对比:
from sklearn import datasets
iris = datasets.load_iris()
type(iris)
# <class 'sklearn.utils.Bunch'>
dir(iris)
# ['DESCR', 'data', 'feature_names', 'filename', 'target', 'target_names']
从 0.23 版开始,您可以使用 as_frame
参数直接 return DataFrame。
例如加载鸢尾花数据集:
from sklearn.datasets import load_iris
iris = load_iris(as_frame=True)
df = iris.data
根据我对 provisionally release notes 的理解,这适用于 breast_cancer、糖尿病、数字、虹膜、linnerud、葡萄酒和 california_houses 数据集。
API 比建议的回复更清晰。在这里,使用 as_frame
并确保也包含响应列。
import pandas as pd
from sklearn.datasets import load_wine
features, target = load_wine(as_frame=True).data, load_wine(as_frame=True).target
df = features
df['target'] = target
df.head(2)
这是另一个集成方法示例,可能会有帮助。
from sklearn.datasets import load_iris
iris_X, iris_y = load_iris(return_X_y=True, as_frame=True)
type(iris_X), type(iris_y)
数据 iris_X 导入为 pandas DataFrame 和
目标 iris_y 被导入为 pandas 系列。
新更新
您可以使用参数 as_frame=True
来获取 pandas 个数据帧。
如果 as_frame 参数可用(例如 load_iris)
from sklearn import datasets
X,y = datasets.load_iris(return_X_y=True) # numpy arrays
dic_data = datasets.load_iris(as_frame=True)
print(dic_data.keys())
df = dic_data['frame'] # pandas dataframe data + target
df_X = dic_data['data'] # pandas dataframe data only
ser_y = dic_data['target'] # pandas series target only
dic_data['target_names'] # numpy array
如果 as_frame 参数不可用(例如 load_boston)
from sklearn import datasets
fnames = [ i for i in dir(datasets) if 'load_' in i]
print(fnames)
fname = 'load_boston'
loader = getattr(datasets,fname)()
df = pd.DataFrame(loader['data'],columns= loader['feature_names'])
df['target'] = loader['target']
df.head(2)
from sklearn.datasets import load_iris
import pandas as pd
iris_dataset = load_iris()
datasets = pd.DataFrame(iris_dataset['data'], columns =
iris_dataset['feature_names'])
target_val = pd.Series(iris_dataset['target'], name =
'target_values')
species = []
for val in target_val:
if val == 0:
species.append('iris-setosa')
if val == 1:
species.append('iris-versicolor')
if val == 2:
species.append('iris-virginica')
species = pd.Series(species)
datasets['target'] = target_val
datasets['target_name'] = species
datasets.head()
这个简单的方法对我有用。
boston = load_boston()
boston_frame = pd.DataFrame(data=boston.data, columns=boston.feature_names)
boston_frame["target"] = boston.target
但这也适用于 load_iris。
你可以使用pd.DataFrame构造函数,给出一个numpy数组(数据)和列名列表(columns)。要将所有内容都放在一个 DataFrame 中,您可以使用 np.c_[...] 将特征和目标连接到一个 numpy 数组中(注意方括号而不是圆括号)。此外,如果在连接之前不将特征名称 (iris['feature_names']) 转换为列表,您可能会遇到一些麻烦:
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= list(iris['feature_names']) + ['target'])
这个问题有很多好的回答;我在下面添加了我自己的。
import pandas as pd
from sklearn.datasets import load_iris
df = pd.DataFrame(
# load all 4 dimensions of the dataframe EXCLUDING species data
load_iris()['data'],
# set the column names for the 4 dimensions of data
columns=load_iris()['feature_names']
)
# we create a new column called 'species' with 150 rows of numerical data 0-2 signifying a species type.
# Our column `species` should have data such `[0, 0, 1, 2, 1, 0]` etc.
df['species'] = load_iris()['target']
# we map the numerical data to string data for species type
df['species'] = df['species'].map({
0 : 'setosa',
1 : 'versicolor',
2 : 'virginica'
})
df.head()
细分
- 出于某种原因,
load_iris['feature_names]
只有 4 列(萼片长度、萼片宽度、花瓣长度、花瓣宽度);此外,load_iris['data']
仅包含上述 feature_names
的数据。
- 相反,物种列名称存储在
load_iris()['target_names'] == array(['setosa', 'versicolor', 'virginica']
。
- 除此之外,物种行数据存储在
load_iris()['target'].nunique() == 3
- 我们的目标只是添加一个名为
species
的新列,该列使用 map
函数将数值数据 0-2
转换为表示鸢尾花种类的 3 种字符串数据。
许多解决方案要么缺少列名称,要么缺少物种目标名称。此解决方案提供 target_name 个标签。
@Ankit-mathanker 的解决方案有效,但是它迭代 Dataframe 系列 'target_names' 以用鸢尾花物种代替整数标识符。
基于格言“Don't iterate a Dataframe if you don't have to”,以下解决方案利用 pd.replace() 更简洁地完成替换。
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris['data'], columns = iris['feature_names'])
df['target'] = pd.Series(iris['target'], name = 'target_values')
df['target_name'] = df['target'].replace([0,1,2],
['iris-' + species for species in iris['target_names'].tolist()])
df.head(3)
sepal length (cm)
sepal width (cm)
petal length (cm)
petal width (cm)
target
target_name
0
5.1
3.5
1.4
0.2
0
iris-setosa
1
4.9
3.0
1.4
0.2
0
iris-setosa
2
4.7
3.2
1.3
0.2
0
iris-setosa
如何将数据从 Scikit-learn Bunch 对象转换为 Pandas DataFrame?
from sklearn.datasets import load_iris
import pandas as pd
data = load_iris()
print(type(data))
data1 = pd. # Is there a Pandas method to accomplish this?
您可以手动使用 pd.DataFrame
构造函数,给出一个 numpy 数组 (data
) 和一个列名列表 (columns
)。
要将所有内容都放在一个 DataFrame 中,您可以使用 np.c_[...]
(注意 []
)将特征和目标连接到一个 numpy 数组中:
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
# save load_iris() sklearn dataset to iris
# if you'd like to check dataset type use: type(load_iris())
# if you'd like to view list of attributes use: dir(load_iris())
iris = load_iris()
# np.c_ is the numpy concatenate function
# which is used to concat iris['data'] and iris['target'] arrays
# for pandas column argument: concat iris['feature_names'] list
# and string list (in this case one string); you can make this anything you'd like..
# the original dataset would probably call this ['Species']
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
可能有更好的方法,但这是我过去所做的并且效果很好:
items = data.items() #Gets all the data from this Bunch - a huge list
mydata = pd.DataFrame(items[1][1]) #Gets the Attributes
mydata[len(mydata.columns)] = items[2][1] #Adds a column for the Target Variable
mydata.columns = items[-1][1] + [items[2][0]] #Gets the column names and updates the dataframe
现在 mydata 将拥有您需要的一切 - 属性、目标变量和列名
from sklearn.datasets import load_iris
import pandas as pd
data = load_iris()
df = pd.DataFrame(data=data.data, columns=data.feature_names)
df.head()
可能对本教程感兴趣:http://www.neural.cz/dataset-exploration-boston-house-pricing.html
找出最佳答案并解决我的评论,这是一个转换函数
def bunch_to_dataframe(bunch):
fnames = bunch.feature_names
features = fnames.tolist() if isinstance(fnames, np.ndarray) else fnames
features += ['target']
return pd.DataFrame(data= np.c_[bunch['data'], bunch['target']],
columns=features)
这对我有用。
dataFrame = pd.dataFrame(data = np.c_[ [iris['data'],iris['target'] ],
columns=iris['feature_names'].tolist() + ['target'])
TOMDLt 的解决方案对于 scikit-learn 中的所有数据集都不够通用。例如,它不适用于波士顿住房数据集。我提出了一个更通用的不同解决方案。也不需要使用 numpy。
from sklearn import datasets
import pandas as pd
boston_data = datasets.load_boston()
df_boston = pd.DataFrame(boston_data.data,columns=boston_data.feature_names)
df_boston['target'] = pd.Series(boston_data.target)
df_boston.head()
作为一般函数:
def sklearn_to_df(sklearn_dataset):
df = pd.DataFrame(sklearn_dataset.data, columns=sklearn_dataset.feature_names)
df['target'] = pd.Series(sklearn_dataset.target)
return df
df_boston = sklearn_to_df(datasets.load_boston())
作为替代方案,我可以更轻松地解决问题:
data = load_iris()
df = pd.DataFrame(data['data'], columns=data['feature_names'])
df['target'] = data['target']
df.head()
基本上不是从一开始就连接起来,而是用特征矩阵制作一个数据框,然后用数据['whatvername']添加目标列并从数据集中获取目标值
我花了 2 个小时才弄明白
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
##iris.keys()
df= pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
取回我的物种 pandas
结合特征和目标变量的其他方法可以使用 np.column_stack
(details)
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
data = load_iris()
df = pd.DataFrame(np.column_stack((data.data, data.target)), columns = data.feature_names+['target'])
print(df.head())
结果:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target
0 5.1 3.5 1.4 0.2 0.0
1 4.9 3.0 1.4 0.2 0.0
2 4.7 3.2 1.3 0.2 0.0
3 4.6 3.1 1.5 0.2 0.0
4 5.0 3.6 1.4 0.2 0.0
如果您需要 target
的字符串标签,则可以通过将 target_names
转换为 dictionary
并添加新列来使用 replace
:
df['label'] = df.target.replace(dict(enumerate(data.target_names)))
print(df.head())
结果:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target label
0 5.1 3.5 1.4 0.2 0.0 setosa
1 4.9 3.0 1.4 0.2 0.0 setosa
2 4.7 3.2 1.3 0.2 0.0 setosa
3 4.6 3.1 1.5 0.2 0.0 setosa
4 5.0 3.6 1.4 0.2 0.0 setosa
此片段仅 syntactic sugar built upon what load_iris
将 return 一个元组而不是字典,并且列名被枚举。
df = pd.DataFrame(np.c_[load_iris(return_X_y=True)])
无论 TomDLT 的回答如何,它可能对你们中的某些人不起作用,因为
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
因为 iris['feature_names'] returns 你是一个 numpy 数组。在 numpy 数组中,您不能仅通过 + 运算符添加数组和列表 ['target']。所以你需要先把它转换成一个列表,然后再添加。
你可以做到
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= list(iris['feature_names']) + ['target'])
这会很好用..
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
X = iris['data']
y = iris['target']
iris_df = pd.DataFrame(X, columns = iris['feature_names'])
iris_df.head()
最佳方法之一:
data = pd.DataFrame(digits.data)
Digits 是 sklearn 数据框,我将其转换为 pandas DataFrame
基本上你需要的是 "data",你在 scikit 束中有它,现在你只需要 "target"(预测),它也在束中。
所以只需要将这两个连接起来就可以使数据完整
data_df = pd.DataFrame(cancer.data,columns=cancer.feature_names)
target_df = pd.DataFrame(cancer.target,columns=['target'])
final_df = data_df.join(target_df)
我从你的回答中吸取了一些想法,但我不知道如何缩短:)
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris['feature_names'])
df['target'] = iris['target']
这给出了一个 Pandas DataFrame,其中 feature_names 加上目标作为列和 RangeIndex(start=0, stop=len(df), step=1)。 我想要一个更短的代码,我可以在其中直接添加 'target'。
否则使用 seaborn data sets 这是实际的 pandas 数据帧:
import seaborn
iris = seaborn.load_dataset("iris")
type(iris)
# <class 'pandas.core.frame.DataFrame'>
与scikit learn数据集对比:
from sklearn import datasets
iris = datasets.load_iris()
type(iris)
# <class 'sklearn.utils.Bunch'>
dir(iris)
# ['DESCR', 'data', 'feature_names', 'filename', 'target', 'target_names']
从 0.23 版开始,您可以使用 as_frame
参数直接 return DataFrame。
例如加载鸢尾花数据集:
from sklearn.datasets import load_iris
iris = load_iris(as_frame=True)
df = iris.data
根据我对 provisionally release notes 的理解,这适用于 breast_cancer、糖尿病、数字、虹膜、linnerud、葡萄酒和 california_houses 数据集。
API 比建议的回复更清晰。在这里,使用 as_frame
并确保也包含响应列。
import pandas as pd
from sklearn.datasets import load_wine
features, target = load_wine(as_frame=True).data, load_wine(as_frame=True).target
df = features
df['target'] = target
df.head(2)
这是另一个集成方法示例,可能会有帮助。
from sklearn.datasets import load_iris
iris_X, iris_y = load_iris(return_X_y=True, as_frame=True)
type(iris_X), type(iris_y)
数据 iris_X 导入为 pandas DataFrame 和 目标 iris_y 被导入为 pandas 系列。
新更新
您可以使用参数 as_frame=True
来获取 pandas 个数据帧。
如果 as_frame 参数可用(例如 load_iris)
from sklearn import datasets
X,y = datasets.load_iris(return_X_y=True) # numpy arrays
dic_data = datasets.load_iris(as_frame=True)
print(dic_data.keys())
df = dic_data['frame'] # pandas dataframe data + target
df_X = dic_data['data'] # pandas dataframe data only
ser_y = dic_data['target'] # pandas series target only
dic_data['target_names'] # numpy array
如果 as_frame 参数不可用(例如 load_boston)
from sklearn import datasets
fnames = [ i for i in dir(datasets) if 'load_' in i]
print(fnames)
fname = 'load_boston'
loader = getattr(datasets,fname)()
df = pd.DataFrame(loader['data'],columns= loader['feature_names'])
df['target'] = loader['target']
df.head(2)
from sklearn.datasets import load_iris
import pandas as pd
iris_dataset = load_iris()
datasets = pd.DataFrame(iris_dataset['data'], columns =
iris_dataset['feature_names'])
target_val = pd.Series(iris_dataset['target'], name =
'target_values')
species = []
for val in target_val:
if val == 0:
species.append('iris-setosa')
if val == 1:
species.append('iris-versicolor')
if val == 2:
species.append('iris-virginica')
species = pd.Series(species)
datasets['target'] = target_val
datasets['target_name'] = species
datasets.head()
这个简单的方法对我有用。
boston = load_boston()
boston_frame = pd.DataFrame(data=boston.data, columns=boston.feature_names)
boston_frame["target"] = boston.target
但这也适用于 load_iris。
你可以使用pd.DataFrame构造函数,给出一个numpy数组(数据)和列名列表(columns)。要将所有内容都放在一个 DataFrame 中,您可以使用 np.c_[...] 将特征和目标连接到一个 numpy 数组中(注意方括号而不是圆括号)。此外,如果在连接之前不将特征名称 (iris['feature_names']) 转换为列表,您可能会遇到一些麻烦:
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= list(iris['feature_names']) + ['target'])
这个问题有很多好的回答;我在下面添加了我自己的。
import pandas as pd
from sklearn.datasets import load_iris
df = pd.DataFrame(
# load all 4 dimensions of the dataframe EXCLUDING species data
load_iris()['data'],
# set the column names for the 4 dimensions of data
columns=load_iris()['feature_names']
)
# we create a new column called 'species' with 150 rows of numerical data 0-2 signifying a species type.
# Our column `species` should have data such `[0, 0, 1, 2, 1, 0]` etc.
df['species'] = load_iris()['target']
# we map the numerical data to string data for species type
df['species'] = df['species'].map({
0 : 'setosa',
1 : 'versicolor',
2 : 'virginica'
})
df.head()
细分
- 出于某种原因,
load_iris['feature_names]
只有 4 列(萼片长度、萼片宽度、花瓣长度、花瓣宽度);此外,load_iris['data']
仅包含上述feature_names
的数据。 - 相反,物种列名称存储在
load_iris()['target_names'] == array(['setosa', 'versicolor', 'virginica']
。 - 除此之外,物种行数据存储在
load_iris()['target'].nunique() == 3
- 我们的目标只是添加一个名为
species
的新列,该列使用map
函数将数值数据0-2
转换为表示鸢尾花种类的 3 种字符串数据。
许多解决方案要么缺少列名称,要么缺少物种目标名称。此解决方案提供 target_name 个标签。
@Ankit-mathanker 的解决方案有效,但是它迭代 Dataframe 系列 'target_names' 以用鸢尾花物种代替整数标识符。
基于格言“Don't iterate a Dataframe if you don't have to”,以下解决方案利用 pd.replace() 更简洁地完成替换。
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris['data'], columns = iris['feature_names'])
df['target'] = pd.Series(iris['target'], name = 'target_values')
df['target_name'] = df['target'].replace([0,1,2],
['iris-' + species for species in iris['target_names'].tolist()])
df.head(3)
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | target | target_name | |
---|---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 | iris-setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 | iris-setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 | iris-setosa |