微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决即使使用.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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。