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