jla*_*rcy 2 python warnings pandas
我有显示所有警告的政策:
import warnings
warnings.simplefilter('always')
Run Code Online (Sandbox Code Playgroud)
我想使用上下文管理器来消除一些误报的 Pandas 警告:
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
Run Code Online (Sandbox Code Playgroud)
但是在查看Pandas 源之后,我找不到SettingWithCopyWarningPandas 中定义该对象的位置。
有谁知道这个对象是在 Pandas 命名空间中定义的吗?
将评论中的信息合并到单个答案中:
import warnings
import pandas as pd
Run Code Online (Sandbox Code Playgroud)
正如@Andrew 指出的,我可以使用专用的 Pandas 上下文管理器来实现它:
with pd.option_context('mode.chained_assignment', None):
# Chaining Assignment, etc...
Run Code Online (Sandbox Code Playgroud)
或者使用 PSLwarnings提供的我可以找到警告SettingWithCopyWarning对象(感谢 @coldspeed 提供的 GitHub 链接):
with warnings.catch_warnings():
warnings.filterwarnings('ignore', category=pd.core.common.SettingWithCopyWarning)
# Chaining Assignment, etc...
Run Code Online (Sandbox Code Playgroud)
请注意,这两种解决方案似乎表现相似,但它们并不完全相同:
附加信息
将此特定警告转换为错误可能是值得的:
pd.set_option('mode.chained_assignment', 'raise')
Run Code Online (Sandbox Code Playgroud)
这将迫使您的开发避免这些特定的边缘情况,并迫使您的代码明确声明它是否适用于视图或仅适用于副本。
当然,异常可以像往常一样被捕获:
try:
# Chaining Assignment, etc...
except pd.core.common.SettingWithCopyError:
pass
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,将警告转换为错误可能会迫使您修改不明确的代码,直到错误消失,而不是捕获相关的异常。
观察
恕我直言,完全沉默这些警告使用:
pd.set_option('mode.chained_assignment', None)
Run Code Online (Sandbox Code Playgroud)
是一种不好的做法,并且无助于生成更好的代码。
| 归档时间: |
|
| 查看次数: |
1905 次 |
| 最近记录: |