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

如何将列表的列表转为含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)]))}

关键注意点

  1. Schema层级匹配:必须用pl.List包裹pl.Struct,对应每行是“元组列表”的结构
  2. 字段类型对应:结构体的字段数量、类型要和元组元素完全匹配(比如元组第一个元素是字符串对应pl.Utf8,第二个是整数对应pl.Int64)
  3. 指定orient参数:orient="row"确保Polars将每个子列表解析为一行,而非将元组拆分为多列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:16:06