如何将列表的列表转为含list[struct[2]]列的Polars DataFrame及Schema问题
解决Polars创建
list[struct[2]]类型单列的Schema ShapeError问题 错误原因
你遇到的ShapeError本质是Schema定义和输入数据的结构不匹配:如果错误地将列类型指定为pl.Struct而非pl.List(pl.Struct),Polars会认为每行是单个结构体,但你的实际数据是结构体组成的列表,导致形状校验失败。
正确的Schema定义与实现代码
要创建类型为list[struct[2]]的单列,需要明确Schema的层级:外层是列表类型,列表元素是包含两个字段的结构体。同时要指定orient="row",让Polars将每个子列表作为单独一行处理。
import polars as pl # 原始数据 list1 = [("a", 1), ("b", 2)] list2 = [("c", 3), ("d", 4), ("e", 5)] # 将每个子列表作为DataFrame的一行 input_data = [list1, list2] # 定义正确的Schema:单列,类型为list[struct[col1: Utf8, col2: Int64]] correct_schema = { "data": pl.List(pl.Struct([ ("col1", pl.Utf8), ("col2", pl.Int64) ])) } # 创建DataFrame df = pl.DataFrame(input_data, schema=correct_schema, orient="row") # 验证结果 print(df) print("\nSchema信息:") print(df.schema)
输出结果
shape: (2, 1) ┌───────────────────────────┐ │ data │ │ --- │ │ list[struct[2]] │ ╞═══════════════════════════╡ │ [{"a",1}, {"b",2}] │ │ [{"c",3}, {"d",4}, {"e",5}] │ └───────────────────────────┘ Schema信息: {'data': List(Struct([('col1', Utf8), ('col2', Int64)]))}
关键注意点
- Schema层级匹配:必须用
pl.List包裹pl.Struct,对应每行是“元组列表”的结构 - 字段类型对应:结构体的字段数量、类型要和元组元素完全匹配(比如元组第一个元素是字符串对应
pl.Utf8,第二个是整数对应pl.Int64) - 指定orient参数:
orient="row"确保Polars将每个子列表解析为一行,而非将元组拆分为多列
内容的提问来源于stack exchange,提问作者vinnewbie
相关产品推荐
相关产品推荐

