如何使用Pandera多列校验定位DataFrame两列同时为空的行
问题描述
现有如下pandas DataFrame,需要开展数据校验,排查Name、Tag两列同时为NULL的异常行。
初始编写的校验代码运行后,返回的校验失败索引为0和2,不符合预期,预期仅返回索引为4的失败行,需要修正Pandera的schema校验规则。
初始错误代码如下:
import pandas as pd import pandera as pa data = [['Alex',10,'t1'],['Bob',12,None],['Clarke',13,'t3'],[None,14,'t3'],[None,15,None]] df = pd.DataFrame(data,columns=['Name','Age','Tag']) schema = pa.DataFrameSchema(checks=pa.Check(lambda df: ~(pd.notnull(df["Name"])&pd.notnull(df["Tag"])) ) ) try: schema.validate(df) except pa.errors.SchemaErrors as err: print("Schema errors and failure cases:") print(err.failure_cases)
错误原因
初始代码的校验逻辑完全写反:
- 原有判断式
~(pd.notnull(df["Name"])&pd.notnull(df["Tag"]))的实际含义是:排除Name和Tag同时非空的行,也就是只要两列不满足同时非空就判定为校验通过,反而把两列都非空的正常行(索引0、2)判定为失败,和需求完全相悖。 - 实际需求是:仅当Name、Tag两列同时为NULL时判定为校验失败,其余行均校验通过。
修正方案
将Check中的判断逻辑调整为「过滤掉Name和Tag同时为空的行」,即校验通过条件为:不满足Name、Tag同时为NULL。修正后的完整代码如下:
import pandas as pd import pandera as pa data = [['Alex',10,'t1'],['Bob',12,None],['Clarke',13,'t3'],[None,14,'t3'],[None,15,None]] df = pd.DataFrame(data,columns=['Name','Age','Tag']) # 修正校验逻辑:仅两列同时为NULL时返回False(校验失败) schema = pa.DataFrameSchema( checks=pa.Check(lambda df: ~(pd.isnull(df["Name"]) & pd.isnull(df["Tag"]))) ) try: schema.validate(df) except pa.errors.SchemaErrors as err: print("Schema errors and failure cases:") print(err.failure_cases)
运行上述代码后,将仅返回索引为4的异常行,符合预期。
内容的提问来源于stack exchange,提问作者user3376169
相关产品推荐
相关产品推荐

