176

当我运行程序时,Pandas 每次都会给出如下所示的“未来警告”。

D:\Python\lib\site-packages\pandas\core\frame.py:3581: FutureWarning: rename with inplace=True  will return None from pandas 0.11 onward
  " from pandas 0.11 onward", FutureWarning) 

我收到了味精,但我只是想阻止 Pandas 一次又一次地显示这样的味精,有没有我可以设置的内置参数让 Pandas 不弹出“未来警告”?

4

5 回答 5

377

在github上找到这个...

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

import pandas
于 2013-04-03T03:19:42.940 回答
25

@bdiamante 的回答可能只能部分帮助您。如果您在抑制警告后仍然收到一条消息,那是因为pandas库本身正在打印该消息。除非您自己编辑 Pandas 源代码,否则您无能为力。也许内部有一个选项可以抑制它们,或者有一种方法可以覆盖它们,但我找不到。


对于那些需要知道为什么...

假设您要确保清洁的工作环境。在脚本的顶部,放置pd.reset_option('all'). 使用 Pandas 0.23.4,您可以获得以下内容:

>>> import pandas as pd
>>> pd.reset_option('all')
html.border has been deprecated, use display.html.border instead
(currently both are identical)

C:\projects\stackoverflow\venv\lib\site-packages\pandas\core\config.py:619: FutureWarning: html.bord
er has been deprecated, use display.html.border instead
(currently both are identical)

  warnings.warn(d.msg, FutureWarning)

: boolean
    use_inf_as_null had been deprecated and will be removed in a future
    version. Use `use_inf_as_na` instead.

C:\projects\stackoverflow\venv\lib\site-packages\pandas\core\config.py:619: FutureWarning:
: boolean
    use_inf_as_null had been deprecated and will be removed in a future
    version. Use `use_inf_as_na` instead.

  warnings.warn(d.msg, FutureWarning)

>>>

按照@bdiamante 的建议,您可以使用该warnings库。现在,确实,警告已被删除。但是,仍然存在一些令人讨厌的消息:

>>> import warnings
>>> warnings.simplefilter(action='ignore', category=FutureWarning)
>>> import pandas as pd
>>> pd.reset_option('all')
html.border has been deprecated, use display.html.border instead
(currently both are identical)


: boolean
    use_inf_as_null had been deprecated and will be removed in a future
    version. Use `use_inf_as_na` instead.

>>>

事实上,禁用所有警告会产生相同的输出:

>>> import warnings
>>> warnings.simplefilter(action='ignore', category=Warning)
>>> import pandas as pd
>>> pd.reset_option('all')
html.border has been deprecated, use display.html.border instead
(currently both are identical)


: boolean
    use_inf_as_null had been deprecated and will be removed in a future
    version. Use `use_inf_as_na` instead.

>>>

在标准库的意义上,这些不是真正的警告。Pandas 实现了自己的警告系统。在警告消息上运行grep -rn表明pandas警告系统在以下位置实现core/config_init.py

$ grep -rn "html.border has been deprecated"
core/config_init.py:207:html.border has been deprecated, use display.html.border instead

进一步的追逐表明我没有时间做这个。你可能也不知道。希望这可以使您免于掉入兔子洞,或者可能会激发某人弄清楚如何真正压制这些消息!

于 2018-12-21T19:29:25.337 回答
16

警告很烦人。如其他答案中所述,您可以使用以下方法抑制它们:

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

但是如果你想一个一个地处理它们并且你正在管理一个更大的代码库,那么很难找到导致警告的代码行。由于与错误不同的警告不带有代码回溯。为了跟踪错误之类的警告,您可以在代码顶部编写以下代码:

import warnings
warnings.filterwarnings("error")

但是如果代码库更大并且它正在导入一堆其他库/包,那么所有类型的警告都将开始作为错误引发。为了仅将某些类型的警告(在您的情况下为 FutureWarning)引发为错误,您可以编写:

import warnings
warnings.simplefilter(action='error', category=FutureWarning)
于 2019-09-27T15:45:51.143 回答
10

这是上下文管理器版本,如果您只想禁止特定代码行的警告。

import warnings
with warnings.catch_warnings():
    warnings.simplefilter(action='ignore', category=FutureWarning)
    # Warning-causing lines of code here
于 2021-03-06T10:53:06.963 回答
6

只需在开始代码之前输入这一行。

import warnings
warnings.filterwarnings("ignore")
于 2021-10-10T14:31:20.903 回答