如何在 pandas 中修复:settingwithcopywarning


使用 pandas 时可能遇到的一个警告是:

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.

当 pandas 遇到一种称为链分配的情况时,就会出现此警告 – 一步中链接和分配的组合。

需要注意的是,这只是一个警告而不是错误。您的代码将继续运行,但结果可能并不总是您所期望的。

抑制此警告的最简单方法是使用以下代码:

 p.d. options . fashion . chained_assignment = None

以下示例展示了如何在实践中响应此警告。

如何重现警告

假设我们创建以下 pandas DataFrame:

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' A ': [25, 12, 15, 14, 19, 23, 25, 29],
                   ' B ': [5, 7, 7, 9, 12, 9, 9, 4],
                   ' C ': [11, 8, 10, 6, 6, 5, 9, 12]})

#view DataFrame
df

	A B C
0 25 5 11
1 12 7 8
2 15 7 10
3 14 9 6
4 19 12 6
5 23 9 5
6 25 9 9
7 29 4 12

现在假设我们创建一个新的 DataFrame,其中仅包含原始 DataFrame 中的“A”列,并将“A”列中的每个值除以 2:

 #define new DataFrame
df2 = df[[' A ']]

#divide all values in column 'A' by 2
df2[' A '] = df[' A '] / 2

/srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:2:
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消息是因为我们正在原始DataFrame的“切片”上为“A”列设置新值。

但是,如果我们查看创建的新 DataFrame,我们将看到每个值实际上已成功除以 2:

 #view new DataFrame
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

尽管我们收到了警告信息,但熊猫仍然做了我们认为它们会做的事情。

如何避免警告

为了避免此警告,建议使用.loc[row indexer, col indexer]语法,如下所示:

 #define new DataFrame
df2 = df. loc [:,[' A ']]

#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2

#view result
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

新的DataFrame包含原始DataFrame中“A”列的所有值,除以二,并且不会出现警告消息。

如果我们想阻止显示警告消息,我们可以使用下面的代码:

 #prevent SettingWithCopyWarning message from appearing
p.d. options . fashion . chained_assignment = None

有关为什么应避免链分配的详细说明,请参阅在线 pandas 文档

其他资源

如何修复:没有名为 pandas 的模块
如何修复:没有名为 numpy 的模块
如何修复:列重叠但未指定后缀

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注