如何获取Pandera警告中的失败行索引(而非仅字符串形式)
Pandera警告中提取校验失败行索引的方法
方案一:直接捕获SchemaWarning对象(推荐)
Pandera的警告本质是SchemaWarning实例,默认被转成字符串输出,你可以通过Python的warnings模块捕获原始对象,直接获取failure_cases:
import pandas as pd import pandera as pa from pandera.errors import SchemaWarning import warnings # 初始化列表存警告对象 captured_warnings = [] # 捕获所有警告 with warnings.catch_warnings(record=True) as w_list: warnings.simplefilter("always") # 示例校验逻辑,开启lazy模式+warn_only规则 schema = pa.DataFrameSchema( { "col1": pa.Column(int), "col2": pa.Column(int, pa.Check(lambda x: x > 0, warn_only=True)) } ) # 执行校验 df = pd.DataFrame({"col1": [1, 2, 3], "col2": [1, -1, 3]}) schema.validate(df, lazy=True) # 筛选出Pandera的SchemaWarning对象 for warn in w_list: if issubclass(warn.category, SchemaWarning): captured_warnings.append(warn.message) # 提取失败行索引 for warn_obj in captured_warnings: print("警告对应的失败行索引:", warn_obj.failure_cases["index"].tolist())
方案二:正则解析警告字符串(应急用)
如果不想改现有代码结构,可以从警告字符串里用正则匹配索引:
import re # 假设你捕获到的警告文本是warn_str warn_str = "SchemaWarning: Column 'col2' failed check: lambda x: x > 0.\nfailure cases:\n index col2\n1 1 -1" # 截取failure cases部分,匹配索引列数值 failure_part = warn_str.split("failure cases:")[-1] failed_indices = [int(idx) for idx in re.findall(r'^\s*(\d+)\s+', failure_part, re.MULTILINE)] print("提取的失败行索引:", failed_indices)
注意点
- 必须开启
lazy=True,否则Pandera遇到校验问题会直接抛出错误,不会触发警告 - 只有设置了
warn_only=True的校验规则,才会以警告形式返回,这类规则的失败信息都会存在SchemaWarning的failure_cases里
内容的提问来源于stack exchange,提问作者Naxi
相关产品推荐
相关产品推荐

