我为大约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")
])
但是,它也列出了未检查的、我不感兴趣的变量x
和y
。Error_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