混合型の列を持つpandasデータフレームがあり、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
シリーズをスケーラーに渡すことが失敗する理由がわかりません。上記の完全に機能するコードでは、シリーズをスケーラーに渡し、データフレームのcolumn =をスケーリングされたシリーズに設定することを望んでいました。この質問が他のいくつかの場所で尋ねられるのを見たことがありますが、良い答えは見つかりませんでした。ここで何が起こっているのかを理解するための助けがあれば大歓迎です!
bad_output = in_max_scaler.fit_transform(dfTest['A'].values)
どちらも機能しませんでした。@larsmans-ええ、私はこの道を行くことを考えていました、それはちょうど面倒のようです。Pandasが完全なデータフレームをsklearn関数に渡すことができるが、シリーズではないことがバグかどうかはわかりません。データフレームについての私の理解は、それがシリーズの口述であるということでした。「Python for Data Analysis」の本を読んで、パンダはnumpy上に構築され、NumPy中心のアプリケーションで簡単に使用できるようになっていると述べています。
bad_output = min_max_scaler.fit_transform(dfTest['A'].values)
か?values
属性にアクセスするとnumpy配列が返されます。何らかの理由でscikit learn apiが適切なメソッドを正しく呼び出して、pandasがnumpy配列を返す場合とそうでない場合があります。