具体来说,使用警告上下文管理器来静音Pandas SettingWithCopyWarning吗?

时间:2018-08-27 15:32:34

标签: python pandas warnings

我有显示所有警告的政策:

import warnings
warnings.simplefilter('always')

我想使用上下文管理器使一些误报的熊猫警告静音:

with warnings.catch_warnings():
    warnings.filterwarnings('ignore', category=SettingWithCopyWarning)
    # Some assignment raising false positive warning that should be silenced

# Some assignment actually raising a true positive warning

但是在看过Pandas source之后,我找不到在熊猫中定义对象SettingWithCopyWarning的位置。

有人知道这个对象在Pandas名称空间中定义的位置吗?

2 个答案:

答案 0 :(得分:1)

以下应满足您的需求:

pd.set_option('mode.chained_assignment', None)

取自https://www.dataquest.io/blog/settingwithcopywarning/

但是,请花一些时间阅读上面的文章,因为它对警告有很多解释。也许您不想一直保持沉默!

答案 1 :(得分:1)

将评论中的信息合并为一个答案:

import warnings
import pandas as pd

正如@Andrew指出的,我可以使用专用的Pandas Context Manager来实现:

with pd.option_context('mode.chained_assignment', None):
    # Chaining Assignment, etc...

或者使用提供的PSL warnings,我可以找到警告SettingWithCopyWarning对象(感谢GitHub链接的@coldspeed):

with warnings.catch_warnings():
    warnings.filterwarnings('ignore', category=pd.core.common.SettingWithCopyWarning)
    # Chaining Assignment, etc...

请注意,两种解决方案的行为似乎相似,但它们并不完全相同:

  • Pandas Context Manager临时更改Pandas选项,然后将其还原;
  • PSL Context Manager会收到特定警告,并在不更改Pandas选项的情况下使其静音。

其他信息

将这个特定的警告转换为错误可能是值得的:

pd.set_option('mode.chained_assignment', 'raise')

这将迫使您的开发避免那些特定的极端情况,并迫使您的代码在视图或仅在副本上工作时明确声明。

当然,可以照常捕获异常:

try:
    # Chaining Assignment, etc...
except pd.core.common.SettingWithCopyError:
    pass

但是在这种情况下,将警告转换为错误可能会迫使您修改模糊的代码,直到错误消失,而不是捕获相关异常。

观察

恕我直言,使用以下方法完全消除这些警告:

pd.set_option('mode.chained_assignment', None)

这是一种不好的做法,并且不利于产生更好的代码。