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?

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

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


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

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


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


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

4

Ini berhasil untuk saya.

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

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

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)

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.


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)

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)

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


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


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

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

0

Salah satu cara terbaik:

data = pd.DataFrame(digits.data)

Digit adalah kerangka data sklearn dan saya mengubahnya menjadi DataFrame pandas


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.


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)

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.


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.