【问题标题】:unexpected SettingWithCopyWarning in pandas even if we use .loc method即使我们使用 .loc 方法,熊猫也会出现意外的 SettingWithCopyWarning
【发布时间】:2020-08-29 06:02:33
【问题描述】:
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 方法。 即使它发出警告,它也已填充了两个数据集中的所有缺失值。

谁能解释一下为什么?

【问题讨论】:

  • 如果将dataset.loc[:, 'workclass'] = dataset.loc[:, 'workclass'].fillna(s) 更改为dataset['workclass'] = dataset['workclass'].fillna(s) 会有什么效果?
  • dataset['workclass'] = dataset['workclass'].fillna(s)?
  • 它仍然给我同样的警告
  • @Anonymous 它与s 是什么有关。
  • @DavidErickson 如你所见s 是一个普通系列

标签: pandas data-analysis missing-data


【解决方案1】:

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

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

SettingWithCopyWarning 的原因在hereissue 中有更详细的解释。

您可以将警告视为误报警告,也可以通过执行以下操作来抑制警告:

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

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 2017-02-23
    • 2016-12-13
    • 2016-07-03
    • 2017-07-07
    • 2014-07-04
    • 2021-11-30
    相关资源
    最近更新 更多