[解決済み] pandasでsklearn fit_transformを使用し、numpy配列の代わりにdataframeを返すには?
質問
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の中の
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を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)
関連
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] Pandas DataFrameの行数を取得する方法は?
-
[解決済み] Pandas DataFrameの特定の列の値がNaNである行を削除する方法
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] Pandasのデータフレームから行を選択するために値のリストを使用する
-
[解決済み】PandasでSettingWithCopyWarningに対処する方法
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] Pythonの文字列書式をリストで使う
-
[解決済み] Django filter queryset __in for *every* item in list
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複