如何让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

