Comment convertir des données d'un objet Scikit-learn Bunch en 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?
Vous pouvez utiliser manuellement le constructeur pd.DataFrame
, en donnant un tableau numpy (data
) et une liste des noms des colonnes (columns
) . avec np.c_[...]
(notez le []
):
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'])
from sklearn.datasets import load_iris
import pandas as pd
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df.head()
Ce tutoriel peut être intéressant: http://www.neural.cz/dataset-exploration-boston-house-pricing.html
La solution de TOMDLt n'est pas assez générique pour tous les jeux de données de scikit-learn. Par exemple, cela ne fonctionne pas pour l'ensemble de données de Boston Housing. Je propose une solution différente qui est plus universelle. Pas besoin d'utiliser numpy aussi.
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()
En fonction générale:
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())
Juste comme une alternative que je pourrais comprendre beaucoup plus facilement:
data = load_iris()
df = pd.DataFrame(data['data'], columns=data['feature_names'])
df['target'] = data['target']
df.head()
Fondamentalement, au lieu de concaténer dès le départ, créez simplement un cadre de données avec la matrice d'entités, puis ajoutez simplement la colonne cible avec data ['nomd'hôte'] et récupérez les valeurs cibles du jeu de données
Cela fonctionne pour moi.
dataFrame = pd.dataFrame(data = np.c_[ [iris['data'],iris['target'] ],
columns=iris['feature_names'].tolist() + ['target'])
M'a pris 2 heures pour comprendre cela
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)
Récupère les espèces pour mes pandas
np.column_stack
( details ) constitue un autre moyen de combiner des caractéristiques et des variables cibles.
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())
Résultat:
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
Si vous avez besoin du libellé de chaîne pour target
, vous pouvez alors utiliser replace
en convertissanttarget_names
en dictionary
et en ajoutant une nouvelle colonne:
df['label'] = df.target.replace(dict(enumerate(data.target_names)))
print(df.head())
Résultat:
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
Travailler sur la meilleure réponse et répondre à mon commentaire, voici une fonction pour la conversion
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)
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()
Un des meilleurs moyens:
data = pd.DataFrame(digits.data)
Digits est la base de données sklearn que j'ai convertie en pandas DataFrame
Quelle que soit la réponse de TomDLT, cela peut ne pas fonctionner pour certains d'entre vous car
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
car iris ['feature_names'] vous renvoie un tableau numpy. Dans numpy tableau, vous ne pouvez pas ajouter un tableau et une liste ['cible'] par simplement + opérateur. Par conséquent, vous devez d'abord le convertir en une liste, puis l'ajouter.
Tu peux faire
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= list(iris['feature_names']) + ['target'])
Cela fonctionnera bien tho ..
Cet extrait est uniquement/ sucre syntaxique construit sur ce que TomDLT et rolyat ont déjà contribué et expliqué La seule différence serait que load_iris
renverra un tuple au lieu d'un dictionnaire et les noms des colonnes sont énumérés.
df = pd.DataFrame(np.c_[load_iris(return_X_y=True)])
Il y a peut-être un meilleur moyen mais voici ce que j'ai fait dans le passé et cela fonctionne plutôt bien:
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
Maintenant, mydata aura tout ce dont vous avez besoin - attributs, variable cible et noms de colonne