Bagaimana cara mengonversi kumpulan data Scikit-learn menjadi kumpulan data Pandas?

108

Bagaimana cara mengonversi data dari objek Scikit-learn Bunch ke 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?
Sampel SANBI
sumber

Jawaban:

135

Secara manual, Anda bisa menggunakan pd.DataFramekonstruktor, memberikan array numpy ( data) dan daftar nama kolom ( columns). Untuk memiliki semuanya dalam satu DataFrame, Anda dapat menggabungkan fitur dan target menjadi satu array numpy dengan np.c_[...](perhatikan []):

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'])
TomDLT
sumber
3
Bisakah Anda menambahkan sedikit teks untuk menjelaskan kode ini? Ini agak singkat menurut standar kami.
gung - Pulihkan Monica
1
Beberapa tandan memiliki feature_names sebagai ndarray yang akan merusak parameter kolom.
1
Kunci dan nilai "Species" untuk dataframe tidak ada.
mastash3ff
4
Kode ini tidak berfungsi sebagaimana adanya untuk saya. Untuk parameter kolom, saya harus meneruskan di kolom = np.append (iris ['feature_names'], 'target). Apakah saya melakukan sesuatu yang salah, atau apakah jawaban ini perlu diedit?
Josh Davis
2
Ini tidak berfungsi untuk semua kumpulan data, seperti load_boston(). Jawaban ini bekerja lebih umum: stackoverflow.com/a/46379878/1840471
Max Ghenis
78
from sklearn.datasets import load_iris
import pandas as pd

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

Tutorial ini mungkin menarik: http://www.neural.cz/dataset-exploration-boston-house-pricing.html

justin4480
sumber
11
Perlu menggabungkan data dengan target: df = pd.DataFrame (np.concatenate ((iris.data, np.array ([iris.target]). T), axis = 1), column = iris.feature_names + [' target '])
Tyler 傲 来 国 主
56

Solusi TOMDLt tidak cukup umum untuk semua kumpulan data di scikit-learn. Misalnya, ini tidak berfungsi untuk kumpulan data perumahan boston. Saya mengusulkan solusi berbeda yang lebih universal. Tidak perlu menggunakan numpy juga.

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

Sebagai fungsi umum:

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

Sebagai alternatif yang bisa saya lakukan dengan lebih mudah:

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

Pada dasarnya alih-alih menggabungkan dari awal, buat saja bingkai data dengan matriks fitur dan kemudian tambahkan kolom target dengan data ['whatvername'] dan ambil nilai target dari dataset

daguito81
sumber
9

Butuh waktu 2 jam untuk menyelesaikannya

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)

Dapatkan kembali spesies panda saya

Victor Tong
sumber
7

Jika tidak, gunakan kumpulan data seaborn yang merupakan bingkai data panda sebenarnya:

import seaborn
iris = seaborn.load_dataset("iris")
type(iris)
# <class 'pandas.core.frame.DataFrame'>

Bandingkan dengan kumpulan data 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']
Paul Rougieux
sumber
4

Ini berhasil untuk saya.

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

Cara lain untuk menggabungkan fitur dan variabel target dapat menggunakan np.column_stack( detail )

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

Hasil:

   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

Jika Anda membutuhkan label string untuk target, maka Anda dapat menggunakan replacedengan mengkonversi target_nameske dictionarydan menambahkan kolom baru:

df['label'] = df.target.replace(dict(enumerate(data.target_names)))
print(df.head())

Hasil:

   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
siswa
sumber
2

Pada dasarnya yang Anda butuhkan adalah "data", dan Anda memilikinya dalam kelompok scikit, sekarang Anda hanya memerlukan "target" (prediksi) yang juga ada dalam kelompok tersebut.

Jadi hanya perlu menggabungkan keduanya untuk membuat datanya lengkap

  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)
Dhiraj Himani
sumber
2

Mulai versi 0.23, Anda bisa langsung mengembalikan DataFrame menggunakan as_frameargumen. Misalnya, memuat set data iris:

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

Dalam pemahaman saya menggunakan catatan rilis sementara , ini berfungsi untuk kumpulan data breast_cancer, diabetes, digit, iris, linnerud, anggur, dan california_houses.

dheinz
sumber
2

Pembaruan: 2020

Anda dapat menggunakan parameter as_frame=True untuk mendapatkan bingkai data pandas.

Jika parameter as_frame tersedia (mis. 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

Jika parameter as_frame TIDAK tersedia (mis. 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)
Bhishan Poudel
sumber
1

Mengerjakan jawaban terbaik dan menangani komentar saya, berikut adalah fungsi untuk konversi

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)

sumber
1

Apa pun jawaban TomDLT, mungkin tidak berhasil untuk sebagian dari Anda karena

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

karena iris ['feature_names'] mengembalikan Anda larik numpy. Dalam larik numpy Anda tidak dapat menambahkan larik dan daftar ['target'] hanya dengan operator +. Oleh karena itu Anda perlu mengubahnya menjadi daftar terlebih dahulu dan kemudian menambahkan.

Anda dapat melakukan

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

Ini akan bekerja dengan baik tho ..

Himanshu Poddar
sumber
0

Mungkin ada cara yang lebih baik tetapi inilah yang telah saya lakukan di masa lalu dan berhasil dengan baik:

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

Sekarang mydata akan memiliki semua yang Anda butuhkan - atribut, variabel target, dan nama kolom

HakunaMaData
sumber
1
Solusi dari TomDLT jauh lebih unggul daripada yang saya sarankan di atas. Itu melakukan hal yang sama tetapi sangat elegan dan mudah dimengerti. Gunakan itu!
HakunaMaData
mydata = pd.DataFrame(items[1][1])melemparTypeError: 'dict_items' object does not support indexing
sampel SANBI
0

Cuplikan ini hanyalah gula sintaksis yang dibangun di atas apa yang telah dikontribusikan dan dijelaskan oleh TomDLT dan rolyat . Satu-satunya perbedaan adalah bahwa load_irisakan mengembalikan tupel alih-alih kamus dan nama kolom disebutkan.

df = pd.DataFrame(np.c_[load_iris(return_X_y=True)])
Jeff Hernandez
sumber
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan langsung. Sebuah penjelasan yang tepat akan sangat meningkatkan nilai jangka panjang dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat untuk pembaca masa depan dengan lainnya, pertanyaan-pertanyaan serupa. Harap edit jawaban Anda untuk menambahkan penjelasan, termasuk asumsi yang Anda buat.
Selamat tinggal StackExchange
0
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()
Manideep Pullalachervu
sumber
0

Salah satu cara terbaik:

data = pd.DataFrame(digits.data)

Digit adalah kerangka data sklearn dan saya mengubahnya menjadi DataFrame pandas

Shilp Baroda
sumber
0

Saya mengambil beberapa ide dari jawaban Anda dan saya tidak tahu bagaimana membuatnya lebih pendek :)

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

Ini memberikan Pandas DataFrame dengan feature_names plus target sebagai kolom dan RangeIndex (start = 0, stop = len (df), step = 1). Saya ingin memiliki kode yang lebih pendek sehingga saya dapat menambahkan 'target' secara langsung.

AdN14
sumber
0

API ini sedikit lebih bersih daripada tanggapan yang disarankan. Di sini, menggunakan as_framedan memastikan untuk menyertakan kolom tanggapan juga.

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)
Mempelajari statistik dengan contoh
sumber
0

Berikut contoh metode terintegrasi lainnya yang mungkin membantu.

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)

Data iris_X diimpor sebagai pandas DataFrame dan target iris_y diimpor sebagai Seri pandas.

Joe
sumber
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()
Ankit Mathanker
sumber
0

Ini adalah metode mudah yang berhasil untuk saya.

boston = load_boston()
boston_frame = pd.DataFrame(data=boston.data, columns=boston.feature_names)
boston_frame["target"] = boston.target

Tapi ini juga bisa diterapkan ke load_iris.

pengguna3151256
sumber