2016-07-17 17 views
0

sklearnのStandardScalerからseveralsメソッドを使用したいと思います。これらのメソッドを、セット全体に適用するのではなく、セットの一部のカラム/フィーチャで使用することは可能ですか?データセットの一部にStandardScalerを適用

例えばセットはdataです:

data = pd.DataFrame({'Name' : [3, 4,6], 'Age' : [18, 92,98], 'Weight' : [68, 59,49]}) 

    Age Name Weight 
0 18  3  68 
1 92  4  59 
2 98  6  49 


col_names = ['Name', 'Age', 'Weight'] 
features = data[col_names] 

私は合うとdata

scaler = StandardScaler().fit(features.values) 
features = scaler.transform(features.values) 
scaled_features = pd.DataFrame(features, columns = col_names) 

     Name  Age Weight 
0 -1.069045 -1.411004 1.202703 
1 -0.267261 0.623041 0.042954 
2 1.336306 0.787964 -1.245657 

を変換しかし、もちろん名前が浮いていませんが、文字列と、私はそれらを標準化する必要はありません。 fittransform関数は、AgeWeightの列にのみどのように適用できますか?

答えて

3

まず、あなたのデータフレームのコピーを作成します。

scaled_features = data.copy() 

を変換して[名前]列を含めないでください:

col_names = ['Age', 'Weight'] 
features = scaled_features[col_names] 
scaler = StandardScaler().fit(features.values) 
features = scaler.transform(features.values) 

、新しいデータフレームを作成しますが、結果を割り当てませんそれらの2つの列に:

scaled_features[col_names] = features 
print(scaled_features) 


     Age Name Weight 
0 -1.411004  3 1.202703 
1 0.623041  4 0.042954 
2 0.787964  6 -1.245657 
+0

それは動作しますが、私はこの方法で初期値を得るために、「inverse_transform」関数を使用することができません。 ValueError:オペランドをシェイプ(3、)(2、)(3、)と一緒にブロードキャストできませんでした – mitsi

+1

'scaler.inverse_transform(scaled_features [col_names] .values)'は私のために働きます。 – ayhan

+0

ilocを間違って使用している可能性があります。最初のインデクサは行インデックス用です。 – ayhan

0

これを行うためのもっとpythonicな方法 -

from sklearn.preprocessing import StandardScaler 
data[['Age','Weight']] = data[['Age','Weight']].apply(
          lambda x: StandardScaler().fit_transform(x)) 
data 

出力 -

  Age Name Weight 
0 -1.411004  3 1.202703 
1 0.623041  4 0.042954 
2 0.787964  6 -1.245657 
+2

Pythonのほうがコードの数が少ない場合、いくつかの問題があります:1)元のデータフレームを変更しています - これは意図していません。2)適用を使用して時間の使用を増やします。3)スケーラオブジェクトを失います。おそらく後で必要です。 – ayhan

+0

「フィットと変換関数を列と年齢と体重にのみ適用するにはどうしたらいいですか?私は、OPがこれらのことをしたかったことに気づいていませんでした。 – hashcode55

関連する問題