为什么我不能使用warnings.filterwarnings使用正则表达式来抑制警告

时间:2016-09-06 06:55:53

标签: python regex pandas warnings

我想使用正则表达式来抑制特定类型的警告。 警告信息是:

C:\Anaconda3\lib\site-packages\pandas\core\indexing.py:420: 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

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
self.obj[item] = s

我压制过滤器的方法:

import warnings
warnings.filterwarnings("ignore", message= ".*A value is trying to.*")

然而,它失败了。我确实尝试将警告消息的不同部分粘贴到正则表达式中但仍然失败。我想知道为什么。

4 个答案:

答案 0 :(得分:1)

尝试仅提供以下代码(不显示消息)。可能是您提到的消息与警告不匹配。

导入警告 warnings.filterwarnings(“ ignore”)

答案 1 :(得分:0)

这是您遇到的错误吗?

AssertionError: message must be a string

warnings.filterwarnings仅对message参数使用字符串,而regex不会在此处编译。如果您确实想抑制此错误,请执行以下操作:

import pandas as pd
warnings.simplefilter("error", pd.core.common.SettingWithCopyWarning)

否则,您可能想要检查避免SettingWithCopyWarning的方法,因为许多其他人都遇到了相同的问题: How to deal with SettingWithCopyWarning in Pandas?

答案 2 :(得分:0)

您的正则表达式与the correct message string不匹配。

r".*A Value is trying to.*""\nA value is trying to be.*"不匹配,因为r"."与除换行符以外的所有匹配。

有时,在不查看生成警告的模块的源代码的情况下,弄清楚实际消息字符串是什么可能很棘手。

答案 3 :(得分:0)

过滤器警告不是这样的。在文档中,您可以看到Omitted arguments default to a value that matches everything.,还可以看到:message (default '') : is a string containing a regular expression that start of the warning message must match

这可以理解为使用操作“一次”将影响每个唯一文本消息显示一次。如果消息中有一个可能更改的字段(例如文件名),则警告将显示每个文件名一次

如果设置了message参数,则每条匹配的唯一文本消息将被显示一次。

这是一个小例子:

import warnings
import random

warnings.filterwarnings("ignore", category=UserWarning)
warnings.warn("You won't see this warning")

message_formater = "this message with number {} will be displayed once"

# deactivating previously created filter
warnings.resetwarnings()
# applying new filter
warnings.filterwarnings("once", message_formater.format("(.*)"), category=UserWarning)

for i in range(100):
    warnings.warn(message_formater.format(random.randint(0, 3)))
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: UserWarning: this message with number 0 will be displayed once

/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: UserWarning: this message with number 3 will be displayed once

/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: UserWarning: this message with number 1 will be displayed once

/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: UserWarning: this message with number 2 will be displayed once