1. ホーム
  2. python

[解決済み] pandasのデータフレーム列をsklearnでスケーリングする

2022-04-13 14:10:22

質問

pandasのdataframeに型が混在したカラムがあり、そのカラムの一部にsklearnのmin_max_scalerを適用したいのですが、可能でしょうか? 理想的には、これらの変換をその場で行いたいのですが、それを行う方法をまだ見つけられていません。 私は以下のようなコードを書いて動作させています。

import pandas as pd
import numpy as np
from sklearn import preprocessing

scaler = preprocessing.MinMaxScaler()

dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
min_max_scaler = preprocessing.MinMaxScaler()

def scaleColumns(df, cols_to_scale):
    for col in cols_to_scale:
        df[col] = pd.DataFrame(min_max_scaler.fit_transform(pd.DataFrame(dfTest[col])),columns=[col])
    return df

dfTest

    A   B   C
0    14.00   103.02  big
1    90.20   107.26  small
2    90.95   110.35  big
3    96.27   114.23  small
4    91.21   114.68  small

scaled_df = scaleColumns(dfTest,['A','B'])
scaled_df

A   B   C
0    0.000000    0.000000    big
1    0.926219    0.363636    small
2    0.935335    0.628645    big
3    1.000000    0.961407    small
4    0.938495    1.000000    small

この変換を行うのに、この方法が好ましいのか、最も効率的な方法なのか、気になります。 df.applyを使用することで、より良い方法があるのでしょうか?

また、以下のコードがうまくいかないことに驚いています。

bad_output = min_max_scaler.fit_transform(dfTest['A'])

データフレーム全体をスケーラーに渡すと、動作します。

dfTest2 = dfTest.drop('C', axis = 1) good_output = min_max_scaler.fit_transform(dfTest2) good_output

なぜスケーラーにシリーズを渡すと失敗するのか、混乱しています。 上記のコードでは、スケーラに系列を渡して、データフレームのカラム = をスケーリングされた系列に設定することを望んでいました。 この質問は他の場所でもいくつか見かけましたが、良い答えは見つかりませんでした。 ここで起こっていることを理解するためのどんな助けでも、非常に感謝されます。

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

以前のバージョンの pandas を使わなくても、次のスニペットが完全に動作するようになりました。 apply

>>> import pandas as pd
>>> from sklearn.preprocessing import MinMaxScaler


>>> scaler = MinMaxScaler()

>>> dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],
                           'B':[103.02,107.26,110.35,114.23,114.68],
                           'C':['big','small','big','small','small']})

>>> dfTest[['A', 'B']] = scaler.fit_transform(dfTest[['A', 'B']])

>>> dfTest
          A         B      C
0  0.000000  0.000000    big
1  0.926219  0.363636  small
2  0.935335  0.628645    big
3  1.000000  0.961407  small
4  0.938495  1.000000  small