Scikit-learnデータセットをPandasデータセットに変換する方法は?
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?
手動で、pd.DataFrame
コンストラクターを使用して、numpy配列(data
)と列の名前のリスト(columns
)を指定できます。すべてを1つのDataFrameに含めるには、機能とターゲットをnp.c_[...]
で1つのnumpy配列に連結できます([]
に注意してください)。
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()
このチュートリアルは興味深いかもしれません: http://www.neural.cz/dataset-exploration-boston-house-pricing.html
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())
頭をより簡単にラップできる代替手段として:
data = load_iris()
df = pd.DataFrame(data['data'], columns=data['feature_names'])
df['target'] = data['target']
df.head()
基本的に、取得から連結するのではなく、フィーチャのマトリックスでデータフレームを作成し、データ['whatvername']でターゲット列を追加して、データセットからターゲット値を取得するだけです。
これは私のために動作します。
dataFrame = pd.dataFrame(data = np.c_[ [iris['data'],iris['target'] ],
columns=iris['feature_names'].tolist() + ['target'])
これを理解するのに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)
パンダの種を取り戻す
機能とターゲット変数を組み合わせる他の方法は、np.column_stack
(- details )を使用することです
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
の文字列ラベルが必要な場合は、target_names
をreplace
に変換してdictionary
を使用し、新しい列を追加できます。
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
ベストアンサーを解決し、私のコメントに対処します。変換用の関数を次に示します
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)
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()
最良の方法の1つ:
data = pd.DataFrame(digits.data)
Digitsはsklearnデータフレームであり、pandas DataFrameに変換しました
TomDLTが答えたものは何でもあなたのために働かないかもしれません
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
iris ['feature_names']はnumpy配列を返すためです。 numpy配列では、+演算子だけでは配列とリスト['target']を追加できません。したがって、最初にリストに変換してから追加する必要があります。
できるよ
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= list(iris['feature_names']) + ['target'])
これはうまく動作します。
このスニペットは、 TomDLTおよびrolyat がすでに貢献および説明したものの上に構築された 構文糖 のみです。唯一の違いは、load_iris
が辞書の代わりにタプルを返し、列名が列挙されることです。
df = pd.DataFrame(np.c_[load_iris(return_X_y=True)])
より良い方法があるかもしれませんが、これは私が過去にやったことであり、非常にうまく機能します:
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に必要なものすべてが含まれます-属性、ターゲット変数、列名