Scikit-learnデータセットをPandasデータセットに変換する方法は?


106

Scikit-learn Bunchオブジェクトから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?

回答:


131

手動で、pd.DataFramenumpy配列(data)と列名のリスト()を指定してコンストラクターを使用できますcolumns。すべてを1つのDataFrameに含めるには、機能とターゲットを1つの派手な配列に連結できますnp.c_[...](に注意してください[])。

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
このコードを説明する短いテキストを追加できますか?これは、私たちの基準ではやや簡潔です。
ガン-モニカを復活させる

1
一部のバンチには、columnsパラメーターを壊すndarrayとしてfeature_namesがあります。

1
データフレームの「種」キーと値がありません。
mastash3ff 2017

4
このコードはそのままでは機能しませんでした。columnsパラメータには、columns = np.append(iris ['feature_names']、 'target)を渡す必要がありました。私は何か間違ったことをしましたか、またはこの回答は編集が必要ですか?
Josh Davis、

2
これはなどのすべてのデータセットでは機能しませんload_boston()。この答えは、より一般的に動作します:stackoverflow.com/a/46379878/1840471
マックスGhenis

73
from sklearn.datasets import load_iris
import pandas as pd

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

このチュートリアルはおそらく興味深いでしょう:http : //www.neural.cz/dataset-exploration-boston-house-pricing.html


10
データをターゲットと連結する必要があります:df = pd.DataFrame(np.concatenate((iris.data、np.array([iris.target])。T)、axis = 1)、columns = iris.feature_names + [' target '])
Tyler傲来国主

55

TOMDLtのソリューションは、scikit-learnのすべてのデータセットに対して十分に一般的ではありません。たとえば、ボストンハウジングのデータセットでは機能しません。より普遍的な別のソリューションを提案します。numpyを使用する必要もありません。

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

一般的な機能として:

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

頭をぐるぐる巻くことができる代わりに、

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

基本的に、get goから連結する代わりに、機能のマトリックスでデータフレームを作成し、data ['whatvername']でターゲット列を追加して、データセットからターゲット値を取得します


9

これを理解するのに2時間かかった

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)

パンダの種を取り戻す


7

それ以外の場合は、実際のパンダデータフレームであるseabornデータセットを使用します。

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

scikit学習データセットと比較:

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

これでうまくいきます。

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

3

機能とターゲット変数を組み合わせる他の方法を使用することができますnp.column_stack詳細

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

結果:

   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

の文字列ラベルが必要な場合は、新しい列に変換して追加するtargetことで使用できます。replacetarget_namesdictionary

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

結果:

   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

基本的に必要なのは「データ」であり、scikitの束の中にあります。今は、束の中にある「ターゲット」(予測)だけが必要です。

したがって、データを完全にするためにこれら2つを連結する必要があるだけです

  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以降、as_frame引数を使用して直接DataFrameを返すことができます。たとえば、アヤメのデータセットをロードします。

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

暫定リリースノートを使用した私の理解で、これは、breast_cancer、糖尿病、数字、虹彩、linnerud、ワイン、およびcalifornia_housesデータセットに対して機能します。


2

更新:2020

パラメータas_frame=Trueを使用して、pandasデータフレームを取得できます。

as_frameパラメータが利用可能な場合(例: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パラメータが使用できない場合(例: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

ベストアンサーを作成し、私のコメントに対処します。変換用の関数があります

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が答えたものは何人かではうまくいかないかもしれません

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

iris ['feature_names']は、数の多い配列を返すためです。numpy配列では、+演算子だけでは配列とリスト['target']を追加できません。したがって、まずリストに変換してから追加する必要があります。

できるよ

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

これは問題なく動作します。


0

より良い方法があるかもしれませんが、これは私が過去に行ったことであり、それは非常にうまく機能します:

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

これで、mydataに必要なものがすべて含まれます-属性、ターゲット変数、列名


1
TomDLTによるソリューションは、上記で提案したものよりもはるかに優れています。同じことをしますが、とてもエレガントで理解しやすいです。それを使用してください!
HakunaMaData 2016年

mydata = pd.DataFrame(items[1][1])スローTypeError: 'dict_items' object does not support indexing
SANBIは

0

このスニペットは、TomDLTとrolyatがすでに貢献して説明したものに基づいて構築された構文上の砂糖にすぎません。唯一の違いは、辞書ではなくタプルを返し、列名が列挙されることです。load_iris

df = pd.DataFrame(np.c_[load_iris(return_X_y=True)])

このコードスニペットをありがとうございます。このコードスニペットは、限られた、即時のヘルプを提供する可能性があります。適切な説明が大幅に長期的な価値を向上させるだろう示すことによって、なぜこれが問題に良い解決策であり、他の、同様の質問を将来の読者にそれがより便利になるだろう。回答を編集して、仮定を含めて説明を追加してください。
Goodbye StackExchange 2018


0

最良の方法の1つ:

data = pd.DataFrame(digits.data)

Digitsはsklearnデータフレームであり、私はそれをpandas DataFrameに変換しました


0

私はあなたの回答からいくつかのアイデアを取り入れましたが、それを短くする方法がわかりません:)

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

これにより、列としてのfeature_namesとターゲットを含むPandas DataFrameとRangeIndex(start = 0、stop = len(df)、step = 1)が得られます。「ターゲット」を直接追加できる短いコードが欲しいのですが。


0

APIは、推奨される応答よりも少しクリーンです。ここでas_frameは、必ず使用して、必ず応答列も含めます。

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

これは、おそらく役立つ別の統合メソッドの例です。

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)

データiris_Xはpandas DataFrameとしてインポートされ、ターゲットのiris_yはpandas Seriesとしてインポートされます。


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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.