Я обошел SettingWithCopyWarning, чувствует себя как неправильный путь и вычислительно неэффективен, есть ли лучший способ? - PullRequest
0 голосов
/ 23 ноября 2018

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

label_encoded_feature_data_to_be_standardised_X_train = X_train_label_encoded[['price', 'vintage']]
label_encoded_feature_data_to_be_standardised_X_test = X_test_label_encoded[['price', 'vintage']]
label_encoded_standard_scaler = StandardScaler()
label_encoded_standard_scaler.fit(label_encoded_feature_data_to_be_standardised_X_train)

X_train_label_encoded_standardised = label_encoded_standard_scaler.transform(label_encoded_feature_data_to_be_standardised_X_train)
X_test_label_encoded_standardised = label_encoded_standard_scaler.transform(label_encoded_feature_data_to_be_standardised_X_test)

Вот как это настроено, тогда я получаю предупреждение, если я делаю это:

X_train_label_encoded.loc[:,'price'] = X_train_label_encoded_standardised[:,0]

, если я делаю это:

X_train_label_encoded_standardised_df = pd.DataFrame(data=X_train_label_encoded_standardised, columns=['price', 'vintage'])

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

X_train_label_encoded = X_train_label_encoded.drop('price', axis=1)
X_train_label_encoded['price'] = X_train_label_encoded_standardised_df.loc[:,'price']

Это также работает:

X_train_label_encoded.replace(to_replace=X_train_label_encoded['price'], value=X_train_label_encoded_standardised_df['price'])

Но даже это кажется слишком неуклюжим с дополнительным созданием DataFrame.

Почему я не могу просто как-то назначить столбец?Или используя какое-то расположение метода замены?В документации, похоже, нет решения, или я просто читаю это неправильно?Отсутствует какое-то очевидное, но не прописанное решение?

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 23 ноября 2018

Часто это предупреждение просто предупреждение.Если ваш код работает и вы не используете цепочечное присвоение, вам часто не о чем беспокоиться.

Если ваше преобразование поддерживает индекс, включая порядок, и ваши данные являются числовыми, вы можете использовать pd.DataFrame.values:

X_train_label_encoded['price'] = X_train_label_encoded_standardised.values[:, 0]

Это должно обойти предупреждение, поскольку X_train_label_encoded_standardised.values оценивается как массив NumPy более низкого уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...