我绕过了SettingWithCopyWarning,感觉方法不对,计算效率低,有更好的方法吗



我在尝试更改DataFrame中的某些值时遇到了常见的SettingWithCopyWarning。我找到了一种不必禁用警告的方法来解决这个问题,但我觉得我做得不对,而且这是不必要的浪费和计算效率低下。

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时也会觉得过于笨重。

为什么我不能以某种方式分配列?或者使用某种替换方法的安排?文档似乎没有解决方案,或者我只是读错了?缺少一些明显但未详细说明的解决方案?

有更好的方法吗

很多时候,这个警告只是一个警告。如果你的代码是有效的,并且你没有使用链式赋值,你通常没有什么可担心的。

如果您的转换维护索引,包括顺序,并且您的数据是数字,则可以使用pd.DataFrame.values:

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

这应该避开警告,因为X_train_label_encoded_standardised.values的计算结果是较低级别的NumPy数组。

最新更新