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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:57:23