Pandera.Column(bool, nullable=True) 在验证包含None值的列时失败

编程语言 2026-07-09

我正在尝试验证一个pandas DataFrame,其中一列是布尔型,但可能存在空值。我按pandera的文档设置了 nullable=True

import pandas as pd
import pandera.pandas as pa

schema = pa.DataFrameSchema({"x": pa.Column(bool, nullable=True)})

df = pd.DataFrame({"x": [True, None]})
schema(df)

我得到

SchemaError: expected series 'x' to have type bool, got object

我对两点感到困惑:

  1. 我写了 nullable=True,而重点是该列可以容纳 None。为什么验证器会拒绝一个 None
  2. 错误提示 "got object",但我的列被定义为 bool。我从来没有要求 object

解决方案

你应该改为

schema = pa.DataFrameSchema({"x": pa.Column("boolean", nullable=True)})
df = pd.DataFrame({"x": pd.array([True, None], dtype="boolean")})
schema(df)

你的错误在于使用bool而不是 "boolean"

为什么会这样:你的模式将该列声明为bool,但pandas实际上并没有把它构建成bool。列表 [True, None] 包含一个 None,而Python的布尔值不能容纳 None,因此pandas回退使用 object 数据类型。这就是错误所报告的不匹配。

nullable=True 也没有帮助。它只允许值中的空值,并不能改变数据类型检查。数据类型检查会先执行,对你来说会失败。

"boolean" 是pandas的可空扩展数据类型。与Python的 bool不同,它可以原生容纳 pd.NA,因此该列维持为布尔型,而不会被当作对象处理。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章