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

指定List类型Schema时Polars DataFrame创建失败原因排查

Polars指定Schema创建DataFrame报错问题解析

问题重现

尝试用Polars创建带指定Schema的两列DataFrame时报错,代码及现象如下:

import polars as pl

data = {"a": [ ["X"], ["Y"], []], "b": [3, 4, 5]}

# 不指定Schema时正常运行
df = pl.DataFrame(data)

df_schema = [("a", pl.List),
             ("b", pl.Int8)]

# 执行报错:invalid series dtype: expected `Utf8`, got `null`
df = pl.DataFrame(data, schema=df_schema)

不指定Schema时,Polars自动推断的DataFrame结构:

shape: (3, 2)
a           b
list[str]   i64
["X"]       3
["Y"]       4
[]          5

问题原因

直接写pl.List作为列类型是错误的——Polars的List是泛型类型,必须明确声明内部元素的子类型。自动推断时Polars识别出列a是list[str](即pl.List(pl.Utf8)),但你指定的pl.List没有子类型信息,Polars无法匹配实际数据的类型,因此抛出错误。

解决方法

修改Schema,给List类型指定明确的子类型pl.Utf8,代码如下:

import polars as pl

data = {"a": [ ["X"], ["Y"], []], "b": [3, 4, 5]}

# 正确的Schema声明
df_schema = [("a", pl.List(pl.Utf8)),
             ("b", pl.Int8)]

df = pl.DataFrame(data, schema=df_schema)

# 查看结果
print(df)
print(df.schema)

运行后输出的DataFrame结构:

shape: (3, 2)
a           b
list[str]   i8
["X"]       3
["Y"]       4
[]          5

对应的Schema为:{'a': List(Utf8), 'b': Int8},完全符合预期。

另外,列b指定pl.Int8是可行的,因为3、4、5都在Int8的取值范围(-128到127)内,不会出现溢出问题。


内容的提问来源于stack exchange,提问作者datahack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:19:59