Pandera-基于多列的验证



我为大约150列的Pandas数据帧创建了一个Pandera验证模式,就像下面模式中的前两行一样。单列验证正在工作,但如何将两列或多列组合起来进行验证?我在这里和这里发现了两个相关的问题,但我仍然无法构建一个有效的模式。

import pandas as pd
import numpy as np
import pandera as pa
df = pd.DataFrame({'preg': [1, 0, 0, np.nan], 'nr_preg': [2, np.nan, 1, np.nan]})
schema = pa.DataFrameSchema({
'preg': pa.Column(float, pa.Check.isin([1, 0]), nullable=True),
'nr_preg': pa.Column(float, pa.Check.in_range(1, 10), nullable=True),
# ...
# not working:
# if preg=0 -> nr_preg must be NaN
'preg': pa.Column(float, pa.Check(lambda s: s['preg'] == 0 & s['nr_preg'].isnull() == False), nullable=True)
})

更新
现在我有了这个解决方案。

df = pd.DataFrame({'preg': [1, 0, 0], 'nr_preg': [2, np.nan, 1], 'x': [1, 2, 3], 'y': [1, 2, 3]})
schema = pa.DataFrameSchema(
# single columns checks
columns={
'preg': pa.Column(int, pa.Check.isin([1, 0]), nullable=True),
'nr_preg': pa.Column(float, pa.Check.in_range(1, 10), nullable=True),
},
# combined column checks
checks=[
pa.Check(lambda df: ~((df['preg'].isin([np.nan, 0])) & (
df['nr_preg'] > 0)), ignore_na=False, error="Error_A")
])

但是,它也列出了未检查的、我不感兴趣的变量xyError_A不适用于此处。如何从结果中删除它们?

0  DataFrameSchema     preg  Error_A             0           0.0      2
1  DataFrameSchema  nr_preg  Error_A             0           1.0      2
2  DataFrameSchema        x  Error_A             0           3.0      2
3  DataFrameSchema        y  Error_A             0           3.0      2

这似乎是预期的行为。此处显示了此GitHub问题的解决方法。

实际上,您需要按索引对唯一错误进行分组,并选择复选列。但这并不理想,因为如果您想跟踪失败的数据,则无法看到用于跟踪失败数据的列。您可以使您的错误更加具体,以尝试并提供帮助。

好消息是,这似乎正在进行中,尽管没有eta。

解决方法示例:

def df_validate(df: pd.DataFrame, schema: pa.DataFrameSchema) -> None:
try: 
schema.validate(df, lazy=True)
except pa.errors.SchemaErrors as schema_errors: 
print("Schema errors and failure cases:")
print(schema_errors.failure_cases.groupby('index')["check"].unique())
# Processs Your Errors

相关内容

  • 没有找到相关文章

最新更新