即使使用.loc方法,也会在熊猫中出现意外的SettingWithCopyWarning

问题描述

workclass = X_train[~X_train['workclass'].isnull()]['workclass'].unique()
for dataset in [X_train,X_test]:
    df = dataset[dataset['workclass'].isnull()].index
    size = len(df)
    s = pd.Series([workclass[np.random.randint(0,8)] for _ in range(size)],index=df,dtype=object)
    dataset.loc[:,'workclass'] = dataset.loc[:,'workclass'].fillna(s)

输出

S:\AnacondaPF\lib\site-packages\pandas\core\indexing.py:965: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

即使我使用SettingWithCopyWarning方法,最后一行也会给我.loc。 即使发出警告,它也已填补了两个数据集中的所有缺失值。

任何人都可以解释为什么吗?

解决方法

我认为您应该使用train_test_split中的sklearn,以便之前拆分数据。

如果不确定您要更改的给定DataFrame是副本还是原始DataFrame,熊猫将发出SettingWithCopyWarning警告。

hereissue更详细地说明了SettingWithCopyWarning的原因。

您可以像误报一样接受警告,也可以通过执行以下操作取消警告:

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y) # X = features y = labels
X_train,X_test = X_train.copy(),X_test.copy()

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...