pandas 中的意外 SettingWithCopyWarning 即使我们使用 .loc 方法

unexpected SettingWithCopyWarning in pandas even if we use .loc method

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

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

谁能解释为什么?

我认为你应该使用 sklearn 中的 train_test_split 来拆分数据。

如果不确定您正在更改的给定 DataFrame 是副本还是原始 DataFrame,pandas 将引发 SettingWithCopyWarning 警告。

更详细地解释了 SettingWithCopyWarning 的原因 here and the issue

您可以将警告视为误报警告,也可以通过以下方式抑制警告:

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()