我绕过了 SettingWithCopyWarning,感觉像是错误的方式并且计算效率低下,有没有更好的方法?

Posted

技术标签:

【中文标题】我绕过了 SettingWithCopyWarning,感觉像是错误的方式并且计算效率低下,有没有更好的方法?【英文标题】:I got around a SettingWithCopyWarning, feels like the wrong way and computationally inefficient, is there a better way? 【发布时间】:2019-04-26 05:19:05 【问题描述】:

我在尝试更改 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 时也会感觉过于笨拙。

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

有更好的方法吗?

【问题讨论】:

【参考方案1】:

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

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

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

这应该回避警告,因为 X_train_label_encoded_standardised.values 评估为较低级别的 NumPy 数组。

【讨论】:

谢谢。最后我只保留了我所拥有的,因为它是最明确的,并且在这种情况下我不严格要求这种效率水平。

以上是关于我绕过了 SettingWithCopyWarning,感觉像是错误的方式并且计算效率低下,有没有更好的方法?的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌入式谷歌表单绕过 CORS

我绕过了 SettingWithCopyWarning,感觉像是错误的方式并且计算效率低下,有没有更好的方法?

绕过安全狗进行sql注入(MySQL)

绕过雷蛇官网的动态验证码

绕过 Chrome 的恶意文件警告

绕过SQL限制的方法