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

如何让Pandera简洁列检查输出完整失败记录?

Pandera列检查如何输出完整失败记录

我是Pandera新手,希望数据验证时能打印出失败的完整记录。我先尝试了简洁的列检查写法:

import pandera.pandas as pa
import pandas as pd
schema = pa.DataFrameSchema(
    {
        "TotalSystemCapacityRating": pa.Column(float, pa.Check.lt(500), nullable=False),
    }
)

# 执行验证
print(schema.validate(completed_view, lazy=True))

验证能正确识别失败,但仅返回错误值,未给出对应完整记录,错误信息如下:

pandera.errors.SchemaErrors: {
"DATA": {
"DATAFRAME_CHECK": [
{
"schema": null,
"column": "TotalSystemCapacityRating",
"check": "less_than(500)",
"error": "Column 'TotalSystemCapacityRating' failed element-wise validator number 0: less_than(500) failure cases: 6440.0, 6000.0, 9240.0, 22550.0"
}
]
}
}

之后我用更繁琐的Lambda函数式检查写法,能输出完整的失败记录:

schema = pa.DataFrameSchema(
    checks=[
        pa.Check(
            lambda df: ~(
                (df["TotalSystemCapacityRating"] >= 500)
            ),
            error="Must have TotalSystemCapacityRating < 500.",
        ),
    ],
)

print(schema.validate(completed_view, lazy=True))

错误信息会打印出4条失败记录的完整数据:

pandera.errors.SchemaErrors: {
"DATA": {
"DATAFRAME_CHECK": [
{
"schema": null,
"column": null,
"check": "Must have TotalSystemCapacityRating < 500.",
"error": "DataFrameSchema 'None' failed element-wise validator number 0: <Check : Must have TotalSystemCapacityRating < 500.> failure cases: 75e4e529-005d-40d6-a094-2329927ba7e2, 3ed561a9-c4e2-46b7-9973-4e25317f038c, ...
}
]
}
}

我希望保留简洁的列检查写法,同时实现这种完整失败记录的输出效果,请问是否可行?


解决方案

完全可行,无需改用DataFrame级检查,只需给列级Check添加自定义错误逻辑,就能在保留简洁写法的同时输出完整失败记录:

方法1:自定义错误函数

通过Check的error参数传入一个函数,该函数可获取验证上下文并筛选出失败行,输出完整数据:

import pandera.pandas as pa
import pandas as pd

def lt_500_error(df, check):
    failed_rows = df[df["TotalSystemCapacityRating"] >= 500]
    return f"Column 'TotalSystemCapacityRating' failed {check} check. 失败记录:\n{failed_rows.to_string()}"

schema = pa.DataFrameSchema(
    {
        "TotalSystemCapacityRating": pa.Column(
            float, 
            pa.Check.lt(500, error=lt_500_error), 
            nullable=False
        ),
    }
)

# 执行验证
schema.validate(completed_view, lazy=True)

方法2:Lambda简化写法

如果不想单独定义函数,可直接用Lambda实现相同逻辑:

schema = pa.DataFrameSchema(
    {
        "TotalSystemCapacityRating": pa.Column(
            float, 
            pa.Check.lt(
                500, 
                error=lambda df, c: f"失败记录:\n{df[df['TotalSystemCapacityRating']>=500].to_string()}"
            ), 
            nullable=False
        ),
    }
)

两种方式都会在验证失败时,直接输出所有不符合条件的完整行数据,同时保留了列级检查的简洁结构。


内容的提问来源于stack exchange,提问作者Sam Firke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 08:44:53