Я обошел SettingWithCopyWarning, чувствует себя как неправильный путь и вычислительно неэффективен, есть ли лучший способ?
Я столкнулся с вечно распространенным 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 ответ
Много раз, это предупреждение просто предупреждение. Если ваш код работает и вы не используете цепочечные присваивания, вам часто не о чем беспокоиться.
Если ваше преобразование поддерживает индекс, включая порядок, и ваши данные являются числовыми, вы можете использовать pd.DataFrame.values
:
X_train_label_encoded['price'] = X_train_label_encoded_standardised.values[:, 0]
Это должно обойти предупреждение, так как X_train_label_encoded_standardised.values
оценивает массив NumPy более низкого уровня.