Scikit-learn Bunch nesnesindeki verileri Pandas DataFrame'e nasıl dönüştürebilirim?
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?
Scikit-learn Bunch nesnesindeki verileri Pandas DataFrame'e nasıl dönüştürebilirim?
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?
Yanıtlar:
Manüel olarak, pd.DataFrame
bir numpy dizi ( data
) ve sütunların adlarının bir listesini ( ) veren yapıcıyı kullanabilirsiniz columns
. Her şeyin tek bir DataFrame içinde olması için, özellikleri ve hedefi tek bir numpy dizisinde birleştirebilirsiniz np.c_[...]
(not edin []
):
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'])
from sklearn.datasets import load_iris
import pandas as pd
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df.head()
Bu eğitici ilgi çekici olabilir: http://www.neural.cz/dataset-exploration-boston-house-pricing.html
TOMDLt'in çözümü, scikit-learn'deki tüm veri kümeleri için yeterince genel değildir. Örneğin, boston konut veri kümesi için çalışmaz. Daha evrensel olan farklı bir çözüm öneriyorum. Ayrıca numpy kullanmaya gerek yok.
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()
Genel bir işlev olarak:
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())
pd.Series(sklearn_dataset.target)
İle değiştirilebilir düşünüyorum sklearn_dataset.target
? En azından benim için 1.1.3
Bunu anlamam 2 saatimi aldı
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)
Pandalarım için türleri geri al
Kafamı çok daha kolay bir şekilde sarabileceğim bir alternatif olarak:
data = load_iris()
df = pd.DataFrame(data['data'], columns=data['feature_names'])
df['target'] = data['target']
df.head()
Temel olarak, başlangıçtan itibaren birleştirmek yerine, özelliklerin matrisiyle bir veri çerçevesi oluşturun ve ardından hedef sütunu verilerle ['whatvername'] ekleyin ve veri kümesinden hedef değerleri alın
Aksi takdirde , gerçek panda veri çerçeveleri olan seaborn veri kümelerini kullanın :
import seaborn
iris = seaborn.load_dataset("iris")
type(iris)
# <class 'pandas.core.frame.DataFrame'>
Scikit öğrenme veri kümeleriyle karşılaştırın:
from sklearn import datasets
iris = datasets.load_iris()
type(iris)
# <class 'sklearn.utils.Bunch'>
dir(iris)
# ['DESCR', 'data', 'feature_names', 'filename', 'target', 'target_names']
Bu benim için çalışıyor.
dataFrame = pd.dataFrame(data = np.c_[ [iris['data'],iris['target'] ],
columns=iris['feature_names'].tolist() + ['target'])
Özellikleri ve hedef değişkenleri birleştirmenin başka bir yolu kullanmak olabilir np.column_stack
( ayrıntılar )
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())
Sonuç:
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
Eğer dize etiketi gerekiyorsa target
, o zaman kullanabilirsiniz replace
dönüştürerek target_names
için dictionary
ve yeni bir sütun ekleyin:
df['label'] = df.target.replace(dict(enumerate(data.target_names)))
print(df.head())
Sonuç:
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
Temelde ihtiyacınız olan şey "veri" ve buna scikit demetinde sahipsiniz, şimdi sadece grubun içinde olan "hedefe" (tahmin) ihtiyacınız var.
Bu nedenle, verileri tamamlamak için bu ikisini birleştirmeniz yeterli
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)
0.23 sürümünden itibaren, as_frame
bağımsız değişkeni kullanarak bir DataFrame'i doğrudan döndürebilirsiniz . Örneğin, iris veri kümesinin yüklenmesi:
from sklearn.datasets import load_iris
iris = load_iris(as_frame=True)
df = iris.data
Anladığım kadarıyla geçici sürüm notlarını kullanarak , bu meme kanseri, diyabet, rakamlar, iris, linnerud, şarap ve california_houses veri setleri için işe yarar.
as_frame=True
Pandas veri çerçevelerini almak için parametreyi kullanabilirsiniz .
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)
Bu benim için çalışan kolay bir yöntem.
boston = load_boston()
boston_frame = pd.DataFrame(data=boston.data, columns=boston.feature_names)
boston_frame["target"] = boston.target
Ancak bu, load_iris'e de uygulanabilir.
En iyi yanıtı bulmak ve yorumuma hitap etmek, işte dönüşüm için bir işlev
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)
TomDLT her ne cevapladıysa, bazılarınız için işe yaramayabilir çünkü
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
çünkü iris ['özellik_adları'] size bir numpy dizisi döndürür. Numpy dizisinde sadece + operatörüyle bir dizi ve bir liste ['hedef'] ekleyemezsiniz. Bu nedenle, önce onu bir listeye dönüştürmeniz ve sonra eklemeniz gerekir.
Yapabilirsin
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= list(iris['feature_names']) + ['target'])
Bu çok iyi çalışacak ..
Daha iyi bir yol olabilir ama işte geçmişte yaptığım şey ve oldukça iyi çalışıyor:
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
Artık mydata ihtiyacınız olan her şeye sahip olacak - öznitelikler, hedef değişkenler ve sütun adları
mydata = pd.DataFrame(items[1][1])
atarTypeError: 'dict_items' object does not support indexing
Bu pasaj, yalnızca TomDLT ve rolyat'ın zaten katkıda bulunduğu ve açıkladığı şey üzerine inşa edilmiş sözdizimsel şekerdir . Tek fark , bir sözlük yerine bir demet döndürmesi ve sütun adlarının numaralandırılması olacaktır.load_iris
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()
En iyi yollardan biri:
data = pd.DataFrame(digits.data)
Rakamlar sklearn veri çerçevesidir ve onu bir Pandalar DataFrame'e dönüştürdüm
Cevaplarınızdan birkaç fikir aldım ve nasıl kısaltacağımı bilmiyorum :)
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']
Bu, sütunlar ve RangeIndex (başlangıç = 0, durdur = len (df), adım = 1) olarak feature_names artı hedefi olan bir Pandas DataFrame verir. Doğrudan 'hedef'in eklenmesini sağlayabileceğim daha kısa bir kod istiyorum.
API, önerilen yanıtlardan biraz daha temizdir. Burada, as_frame
bir yanıt sütunu kullanmak ve bundan emin olmak.
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)
İşte başka bir entegre yöntem örneği faydalı olabilir.
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)
İris_X verileri, pandalar DataFrame olarak içe aktarılır ve hedef iris_y, pandalar Serisi olarak içe aktarılır.
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()