web-dev-qa-db-fra.com

Comment convertir un jeu de données Scikit-learn en un jeu de données Pandas?

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?
52
SANBI samples

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'])
78
TomDLT
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

35
justin4480

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())
22
Nilav Baran Ghosh

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

7
daguito81

Cela fonctionne pour moi.

dataFrame = pd.dataFrame(data = np.c_[ [iris['data'],iris['target'] ],
columns=iris['feature_names'].tolist() + ['target'])
3
Mukul Aggarwal

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

3
Victor Tong

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
2
student

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)
1
user1969453
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()
0

Un des meilleurs moyens:

data = pd.DataFrame(digits.data)

Digits est la base de données sklearn que j'ai convertie en pandas DataFrame

0
Shilp Baroda

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 ..

0
Himanshu Poddar

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)])
0
Jeff Hernandez

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

0
HakunaMaData