问题描述
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
警告。
here和issue更详细地说明了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()