Scikit-learn veri kümesini Pandas veri kümesine nasıl dönüştürebilirim?


117

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:


143

Manüel olarak, pd.DataFramebir 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'])

3
Bu kodu açıklamak için biraz metin ekleyebilir misiniz? Bu, bizim standartlarımıza göre biraz kısadır.
gung - Monica'yı eski

1
Bazı gruplarda, sütunlar parametresini bozacak bir ndarray olarak özellik_simleri bulunur.

1
Veri çerçevesi için "Türler" anahtarı ve değerleri eksik.
mastash3ff

4
Bu kod benim için olduğu gibi çalışmadı. Sütunlar parametresi için, sütunlar = np.append (iris ['feature_names'], 'target)' ı geçirmem gerekiyordu. Yanlış bir şey mi yaptım yoksa bu yanıtın düzeltilmesi mi gerekiyor?
Josh Davis

2
Bu, gibi tüm veri kümeleri için çalışmaz load_boston(). Bu cevap daha genel olarak işe
yarar


62

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
3142 maple

13

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


11

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


8

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

4

Bu benim için çalışıyor.

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

3

Ö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 replacedönüştürerek target_namesiçin dictionaryve 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

2

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)

2

0.23 sürümünden itibaren, as_framebağı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.


2

Güncelleme: 2020

as_frame=TruePandas veri çerçevelerini almak için parametreyi kullanabilirsiniz .

As_frame parametresi mevcutsa (ör. 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

As_frame parametresi mevcut DEĞİLSE (ör. 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)

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.


1

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)

1

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


0

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ı


1
TomDLT'nin çözümü, yukarıda önerdiğimden çok daha üstün. Aynı şeyi yapıyor ama çok zarif ve anlaşılması kolay. Bunu kullan!
HakunaMaData

mydata = pd.DataFrame(items[1][1])atarTypeError: 'dict_items' object does not support indexing
SANBI örnekleri

0

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

Sınırlı ve anında yardım sağlayabilecek bu kod parçacığı için teşekkür ederiz. Bir Doğru bir açıklama ölçüde uzun vadeli değer artıracak göstererek neden bu soruna iyi bir çözüm olduğunu ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar da dahil olmak üzere bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Hoşçakal 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

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


0

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.


0

API, önerilen yanıtlardan biraz daha temizdir. Burada, as_framebir 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)

0

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


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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.