Python >> Python Program >  >> Python

Använd StandardScaler på delar av en datamängd

Uppdatering:

För närvarande är det bästa sättet att hantera detta att använda ColumnTransformer som förklaras här.

Skapa först en kopia av din dataram:

scaled_features = data.copy()

Inkludera inte kolumnen Namn i transformationen:

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

Skapa nu inte en ny dataram utan tilldela resultatet till dessa två kolumner:

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

Introducerad i v0.20 är ColumnTransformer som applicerar transformatorer på en specificerad uppsättning kolumner i en array eller pandas DataFrame.

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

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

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler

ct = ColumnTransformer([
        ('somename', StandardScaler(), ['Age', 'Weight'])
    ], remainder='passthrough')

ct.fit_transform(features)

OBS:Liksom Pipeline har den också en förkortad version make_column_transformer som inte kräver att transformatorerna namnges

Utdata

-1.41100443,  1.20270298,  3.       
 0.62304092,  0.04295368,  4.       
 0.78796352, -1.24565666,  6.       

Ett annat alternativ skulle vara att släppa namnkolumnen innan skalning och sedan slå samman den igen:

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

# Save the variable you don't want to scale
name_var = data['Name']

# Fit scaler to your data
scaler.fit(data.drop('Name', axis = 1))

# Calculate scaled values and store them in a separate object
scaled_values = scaler.transform(data.drop('Name', axis = 1))

data = pd.DataFrame(scaled_values, index = data.index, columns = data.drop('ID', axis = 1).columns)
data['Name'] = name_var

print(data)