You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:05:28