1. ホーム
  2. python

[解決済み] pandasでsklearn fit_transformを使用し、numpy配列の代わりにdataframeを返すには?

2022-09-12 10:26:03

質問

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

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

ネットで見つけた"solution"は。

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

動作しているように見えますが、deprecationwarningが発生します。

/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, in features = features.apply(lambda x: autoscaler.fit_transform(x.reshape(-1, 1))) ファイル "/usr/lib/python3.5/site-packages/pandas/core/frame.py", line 3972, in 適用 return self._apply_standard(f, axis, reduce=reduce) ファイル "/usr/lib/python3.5/site-packages/pandas/core/frame.py", line 4081, in 標準を適用する result = self._constructor(data=results, index=index) ファイル "/usr/lib/python3.5/site-packages/pandas/core/frame.py", ライン 226, in init mgr = self._init_dict(data, index, columns, dtype=dtype) ファイル "/usr/lib/python3.5/site-packages/pandas/core/frame.py", line 363, in _init_dict dtype=dtype) ファイル "/usr/lib/python3.5/site-packages/pandas/core/frame.py", line 5163, in _arrays_to_mgr arrays = _homogenize(arrays, index, dtype) ファイル "/usr/lib/python3.5/site-packages/pandas/core/frame.py", line 5477, in _homogenize raise_cast_failure=False) ファイル "/usr/lib/python3.5/site-packages/pandas/core/series.py", ライン 2885, in _sanitize_array raise Exception('Data must be 1-dimensional') Exception: データは1次元でなければなりません

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

どのように解決するのですか?

DataFrameをnumpyの配列として変換するには、次のようにします。 as_matrix() . ランダムなデータセットでの例。

編集してください。 変更 as_matrix()values の最後の文にあるように、(結果は変わりません)。 as_matrix() の最後の文にあるとおりです。

一般的には、'.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_features array :

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に代入する(注意:DataFrameの中の indexcolumns キーワード引数で、元のインデックスとカラム名を保持します。

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をpandasで使いやすくすることにフォーカスしています。 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)