Як перетворити набір даних Scikit-learn у набір даних Pandas?


106

Як перетворити дані з об’єкта 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?

Відповіді:


132

Вручну ви можете використовувати pd.DataFrameконструктор, надаючи масив numpy ( data) і список імен стовпців ( columns). Щоб мати все в одному DataFrame, ви можете об'єднати функції та ціль в один масив numpy за допомогою np.c_[...](зверніть увагу []):

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

3
Чи можете ви додати трохи тексту для пояснення цього коду? За нашими стандартами це є дещо коротким.
gung - Відновити Моніку

1
Деякі зв’язки мають імена функцій як ndarray, що порушує параметр стовпців.

1
Відсутній ключ і значення "Вид" для кадру даних.
mastash3ff

4
Цей код для мене не працював як є. Для параметра стовпців мені потрібно було передати стовпці = np.append (iris ['feature_names'], 'target). Я щось зробив неправильно, чи цю відповідь потребує редагування?
Джош Девіс,

2
Це працює не для всіх наборів даних, таких як load_boston(). Ця відповідь працює в більш загальному плані : stackoverflow.com/a/46379878/1840471
Макс Ghenis

74
from sklearn.datasets import load_iris
import pandas as pd

data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df.head()

Цей підручник може зацікавити: http://www.neural.cz/dataset-exploration-boston-house-pricing.html


10
Потрібно об’єднати дані з цільовою: df = pd.DataFrame (np.concatenate ((iris.data, np.array ([iris.target]). T), axis = 1), columns = iris.feature_names + [' ціль '])
Тайлер 傲 来 国 主

55

Рішення 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())

10

Як альтернатива, яку я міг би обернути головою набагато простіше:

data = load_iris()
df = pd.DataFrame(data['data'], columns=data['feature_names'])
df['target'] = data['target']
df.head()

Взагалі замість конкатенації з самого початку просто створіть фрейм даних з матрицею функцій, а потім просто додайте цільовий стовпець з даними ['whatvername'] і захопіть цільові значення з набору даних


9

Мені знадобилося 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)

Поверніть вид для моїх панд


7

В іншому випадку використовуйте набори даних seaborn, які є фактичними кадрами даних панд:

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']


3

Інший спосіб поєднання ознак та цільових змінних може бути використання np.column_stack( детально )

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, то ви можете використовувати replaceшляхом перетворення target_namesв dictionaryі додати новий стовпець:

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

2

В основному вам потрібні "дані", і вони є у вас в пучку scikit, тепер вам потрібна просто "ціль" (передбачення), яка також є в групі.

Тож просто потрібно поєднати ці два, щоб зробити дані повними

  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)

2

Починаючи з версії 0.23, ви можете безпосередньо повернути DataFrame, використовуючи as_frameаргумент. Наприклад, завантаження набору даних райдужки:

from sklearn.datasets import load_iris
iris = load_iris(as_frame=True)
df = iris.data

На моє розуміння, використовуючи попередні примітки до випуску , це працює для набору даних breast_cancer, diabetes, digits, iris, linnerud, wine та california_houses.


2

Оновлення: 2020

Ви можете використовувати параметр 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)

1

Опрацюючи найкращу відповідь та звернувшись до мого коментаря, ось функція перетворення

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

Що б TomDLT не відповів, це може не спрацювати для деяких з вас, тому що

data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                 columns= iris['feature_names'] + ['target'])

оскільки iris ['feature_names'] повертає вам масив numpy. У масиві numpy ви не можете додати масив і список ['target'] лише оператором +. Отже, вам потрібно спочатку перетворити його у список, а потім додати.

Ви можете зробити

data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                 columns= list(iris['feature_names']) + ['target'])

Це буде добре працювати ..


0

Може бути кращий спосіб, але ось те, що я робив у минулому, і це працює досить добре:

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 буде все необхідне - атрибути, цільові змінні та імена стовпців


1
Рішення TomDLT набагато перевершує те, що я пропоную вище. Це робить те саме, але дуже елегантно і легко зрозуміти. Використовуйте це!
HakunaMaData

mydata = pd.DataFrame(items[1][1])кидкиTypeError: 'dict_items' object does not support indexing
зразки SANBI

0

Цей фрагмент - це лише синтаксичний цукор, побудований на тому, що TomDLT і rolyat вже внесли та пояснили. Єдиною різницею буде те, що load_irisзамість словника повернеться кортеж, а імена стовпців перераховані.

df = pd.DataFrame(np.c_[load_iris(return_X_y=True)])

Дякуємо за цей фрагмент коду, який може надати обмежену негайну допомогу. Належне пояснення було б значно поліпшити свою довгострокову цінність , показуючи , чому це хороше рішення проблеми, і зробить його більш корисним для читачів майбутніх з іншими подібними питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи припущення, які ви зробили.
До побачення StackExchange


0

Один з найкращих способів:

data = pd.DataFrame(digits.data)

Digits - це фрейм даних sklearn, і я перетворив його на pandas DataFrame


0

Я взяв кілька ідей з ваших відповідей, і не знаю, як це зробити коротше :)

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 з іменами_функцій плюс ціль як стовпці та RangeIndex (start = 0, stop = len (df), step = 1). Я хотів би мати коротший код, куди я можу безпосередньо додати "ціль".


0

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)

0

Ось ще один приклад інтегрованого методу може бути корисним.

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


0
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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.