Подтвердить что ты не робот

Как преобразовать набор данных Scikit-learn в набор данных Pandas?

Как преобразовать данные из объекта Scookit-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?
4b9b3361

Ответ 1

В ручном режиме вы можете использовать конструктор 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

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

Ответ 4

Так же, как альтернатива, что я мог бы облегчить мою голову:

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

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

Ответ 5

Это работает для меня.

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

Ответ 6

Мне потребовалось 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

Другим способом комбинирования функций и целевых переменных может быть использование 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

Ответ 8

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

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)

Ответ 9

Там может быть лучший способ, но вот что я сделал в прошлом, и он работает очень хорошо:

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 будет иметь все, что вам нужно - атрибуты, целевую переменную и имена столбцов

Ответ 10

Этот фрагмент - только синтаксический сахар, построенный на том, что TomDLT и ролят уже внесли и объяснили. Единственным отличием будет то, что load_iris вернет кортеж вместо словаря, а имена столбцов будут перечислены.

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

Ответ 11

Что бы ни ответил TomDLT, это может не сработать для некоторых из вас, потому что

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

потому что iris ['feature_names'] возвращает вам пустой массив. В массиве numpy вы не можете добавить массив и список ['target'] просто оператором+. Следовательно, вам нужно сначала преобразовать его в список, а затем добавить.

Ты можешь сделать

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

Это будет хорошо работать, хотя..

Ответ 12

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()

Ответ 13

Один из лучших способов:

data = pd.DataFrame(digits.data)

Цифры - это фрейм данных sklearn, и я преобразовал его в панду.

Ответ 14

По сути, вам нужны "данные", и они у вас есть в связке scikit, теперь вам нужна только "цель" (прогноз), которая также есть в связке.

Так что просто нужно объединить эти два, чтобы сделать данные полными

  data_df = pd.DataFrame(cancer.data,columns=cancer.feature_names)
  target_df = pd.DataFrame(cancer.target,columns=['target'])

  final_df = data.join(target)