Как масштабировать все столбцы, кроме последнего? - PullRequest
2 голосов
/ 02 апреля 2020

Я использую python 3.7.6.

Я работаю над проблемой классификации.

Я хочу масштабировать столбцы объектов фрейма данных (df). dataframe содержит 56 столбцов (55 столбцов объектов, а последний столбец - целевой столбец).

Я хочу масштабировать столбцы объектов.

Я делаю это следующим образом:

y = df.iloc[:,-1]
target_name = df.columns[-1]
from FeatureScaling import feature_scaling
df = feature_scaling.scale(df.iloc[:,0:-1], standardize=False)
df[target_name] = y

но это кажется неэффективным, потому что мне нужно воссоздать dataframe (добавить целевой столбец к результату масштабирования).

Есть ли способ масштабировать только некоторые столбцы без изменений другие, эффективно? (т.е. результат из scale будет содержать масштабированные столбцы и один столбец, который не масштабируется)

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Использование индекса столбцов для масштабирования или других операций предварительной обработки не очень хорошая идея, поскольку каждый раз, когда вы создаете новую функцию, она нарушает код. Скорее используйте имена столбцов. например,

с использованием scikit-learn:

from sklearn.preprocessing import StandardScaler, MinMaxScaler
features = [<featues to standardize>]
scalar = StandardScaler()
# the fit_transform ops returns a 2d numpy.array, we cast it to a pd.DataFrame
standardized_features = pd.DataFrame(scalar.fit_transform(df[features].copy()), columns = features)
old_shape = df.shape
# drop the unnormalized features from the dataframe
df.drop(features, axis = 1, inplace = True)
# join back the normalized features
df = pd.concat([df, standardized_features], axis= 1)
assert old_shape == df.shape, "something went wrong!"

или вы можете использовать функцию, подобную этой, если вы не предпочитаете разделять и объединять данные обратно.

import numpy as np
def normalize(x):
    if np.std(x) == 0:
        raise ValueError('Constant column')
    return (x -np.mean(x)) / np.std(x)

for col in features:
    df[col] = df[col].map(normalize)
0 голосов
/ 02 апреля 2020

Вы можете нарезать столбцы, которые вы хотите:

df.iloc[:, :-1] = feature_scaling.scale(df.iloc[:, :-1], standardize=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...