web-dev-qa-db-ja.com

sklearn fit_transformをpandasとともに使用して、numpy配列の代わりにデータフレームを返す方法は?

スケーリングを(sklearn.preprocessingのStandardScaler()を使用して)pandasデータフレームに適用したい。次のコードはnumpy配列を返すため、すべての列名とインデックスが失われます。これは私が望むものではありません。

features = df[["col1", "col2", "col3", "col4"]]
autoscaler = StandardScaler()
features = autoscaler.fit_transform(features)

私がオンラインで見つけた「解決策」は次のとおりです。

features = features.apply(lambda x: autoscaler.fit_transform(x))

動作しているように見えますが、非推奨の警告が表示されます。

/usr/lib/python3.5/site-packages/sklearn/preprocessing/data.py:583:DeprecationWarning:データとして1d配列を渡すことは0.17で非推奨となり、0.19でValueErrorが発生します。データに単一の特徴がある場合はX.reshape(-1、1)を使用し、単一のサンプルが含まれる場合はX.reshape(1、-1)を使用してデータを再構成します。

したがって、私は試しました:

features = features.apply(lambda x: autoscaler.fit_transform(x.reshape(-1, 1)))

しかし、これは以下を与えます:

トレースバック(最後の最後の呼び出し):ファイル「./analyse.py」、行91、機能= features.apply(lambda x:autoscaler.fit_transform(x.reshape(-1、1)))ファイル「/ usr/lib/python3.5/site-packages/pandas/core/frame.py」、行3972、apply return self._apply_standard(f、axis、reduce = reduce)ファイル「/usr/lib/python3.5/site- packages/pandas/core/frame.py "、行4081、_apply_standardの結果= self._constructor(data = results、index = index)ファイル" /usr/lib/python3.5/site-packages/pandas/core/frame .py」、226行目init mgr = self._init_dict(data、index、columns、dtype = dtype)File "/usr/lib/python3.5/site-packages/pandas/core /frame.py」、363行目、_init_dict dtype = dtype)ファイル「/usr/lib/python3.5/site-packages/pandas/core/frame.py」、5163行目、_arrays_to_mgrの配列= _homogenize(arrays、 index、dtype)ファイル「/usr/lib/python3.5/site-packages/pandas/core/frame.py」、行5477、_homogenize raise_cast_failure = False)ファイル「/usr/lib/python3.5/site- packages/pandas/core/series.py "、行2885、_san itize_array raise Exception( 'Data must be one-dimensional')例外:データは1次元でなければならない

pandasデータフレームにスケーリングを適用し、データフレームをそのまま残しますか?可能であればデータをコピーせずに。

40
louic

as_matrix() を使用して、DataFrameをnumpy配列として変換できます。ランダムデータセットの例:

編集:上記のas_matrix()ドキュメントの最後の文ごとに、as_matrix()valuesに変更します(結果は変わりません)。

通常、「。values」を使用することをお勧めします。

import pandas as pd
import numpy as np #for the random integer example
df = pd.DataFrame(np.random.randint(0.0,100.0,size=(10,4)),
              index=range(10,20),
              columns=['col1','col2','col3','col4'],
              dtype='float64')

インデックスは10〜19です。

In [14]: df.head(3)
Out[14]:
    col1    col2    col3    col4
    10  3   38  86  65
    11  98  3   66  68
    12  88  46  35  68

fit_transformを取得するDataFrame scaled_featuresarray

from sklearn.preprocessing import StandardScaler
scaled_features = StandardScaler().fit_transform(df.values)

In [15]: scaled_features[:3,:] #lost the indices
Out[15]:
array([[-1.89007341,  0.05636005,  1.74514417,  0.46669562],
       [ 1.26558518, -1.35264122,  0.82178747,  0.59282958],
       [ 0.93341059,  0.37841748, -0.60941542,  0.59282958]])

スケーリングされたデータをDataFrameに割り当てます(注:indexおよびcolumnsキーワード引数を使用して、元のインデックスと列名を保持します。

scaled_features_df = pd.DataFrame(scaled_features, index=df.index, columns=df.columns)

In [17]:  scaled_features_df.head(3)
Out[17]:
    col1    col2    col3    col4
10  -1.890073   0.056360    1.745144    0.466696
11  1.265585    -1.352641   0.821787    0.592830
12  0.933411    0.378417    -0.609415   0.592830

編集2:

sklearn-pandas パッケージに登場しました。パンダでscikit-learnを使いやすくすることに焦点を当てています。 sklearn-pandasは、より一般的なシナリオであるDataFrameの列サブセットに複数のタイプの変換を適用する必要がある場合に特に役立ちます。文書化されていますが、これが、今実行した変換を実現する方法です。

from sklearn_pandas import DataFrameMapper

mapper = DataFrameMapper([(df.columns, StandardScaler())])
scaled_features = mapper.fit_transform(df.copy(), 4)
scaled_features_df = pd.DataFrame(scaled_features, index=df.index, columns=df.columns)
43
Kevin
import pandas as pd    
from sklearn.preprocessing import StandardScaler

df = pd.read_csv('your file here')
ss = StandardScaler()
df_scaled = pd.DataFrame(ss.fit_transform(df),columns = df.columns)

Df_scaledは「同じ」データフレームになりますが、スケーリングされた値のみが使用されます

6
Joe