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?
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:
Secara manual, Anda bisa menggunakan pd.DataFrame
konstruktor, 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'])
load_boston()
. Jawaban ini bekerja lebih umum: stackoverflow.com/a/46379878/1840471
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
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())
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
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
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']
Ini berhasil untuk saya.
dataFrame = pd.dataFrame(data = np.c_[ [iris['data'],iris['target'] ],
columns=iris['feature_names'].tolist() + ['target'])
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 replace
dengan mengkonversi target_names
ke dictionary
dan 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
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)
Mulai versi 0.23, Anda bisa langsung mengembalikan DataFrame menggunakan as_frame
argumen. 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.
Anda dapat menggunakan parameter as_frame=True
untuk mendapatkan bingkai data pandas.
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
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)
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)
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 ..
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
mydata = pd.DataFrame(items[1][1])
melemparTypeError: 'dict_items' object does not support indexing
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_iris
akan mengembalikan tupel alih-alih kamus dan nama kolom disebutkan.
df = pd.DataFrame(np.c_[load_iris(return_X_y=True)])
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()
Salah satu cara terbaik:
data = pd.DataFrame(digits.data)
Digit adalah kerangka data sklearn dan saya mengubahnya menjadi DataFrame pandas
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.
API ini sedikit lebih bersih daripada tanggapan yang disarankan. Di sini, menggunakan as_frame
dan 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)
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()
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.