Pandera.Column(bool, nullable=True) 在验证包含None值的列时失败
我正在尝试验证一个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
我对两点感到困惑:
- 我写了
nullable=True,而重点是该列可以容纳None。为什么验证器会拒绝一个None? - 错误提示 "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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。