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

Polars表达式中将列转为list失败问题(版本更新后)

解决Polars新版本中列转List的SchemaError问题

问题复现

假设你的示例DataFrame如下:

import polars as pl

df = pl.DataFrame({
    "group": ["A", "A", "B", "B"],
    "value": [1, 2, 3, 4]
})

若你尝试直接将value列转为List类型列(比如旧版本的写法):

df.with_columns(pl.col("value").alias("value_list"))

会触发SchemaError: expected List, got i64,这是因为Polars新版本(0.19.x及以后)对类型校验更严格,不允许隐式将标量列转为List列。

正确解决方案

根据你的需求(后续结合窗口分区),分两种场景处理:

1. 全局将整列转为单个List

如果需要把整个value列合并成一个List并作为新列:

df_global = df.with_columns(pl.col("value").agg().alias("value_list"))

输出结果:

shape: (4, 3)
┌───────┬───────┬────────────┐
│ group ┆ value ┆ value_list │
│ ---   ┆ ---   ┆ ---        │
│ str   ┆ i64   ┆ list[i64]  │
╞═══════╪═══════╪════════════╡
│ A     ┆ 1     ┆ [1, 2, 3,4]│
│ A     ┆ 2     ┆ [1, 2, 3,4]│
│ B     ┆ 3     ┆ [1, 2, 3,4]│
│ B     ┆ 4     ┆ [1, 2, 3,4]│
└───────┴───────┴────────────┘

2. 窗口分区内生成List列(符合你的后续需求)

如果需要按指定分区(比如group列),将每个分区内的value转为List:

df_window = df.with_columns(pl.col("value").list().over("group").alias("value_list"))

输出结果:

shape: (4, 3)
┌───────┬───────┬────────────┐
│ group ┆ value ┆ value_list │
│ ---   ┆ ---   ┆ ---        │
│ str   ┆ i64   ┆ list[i64]  │
╞═══════╪═══════╪════════════╡
│ A     ┆ 1     ┆ [1, 2]     │
│ A     ┆ 2     ┆ [1, 2]     │
│ B     ┆ 3     ┆ [3, 4]     │
│ B     ┆ 4     ┆ [3, 4]     │
└───────┴───────┴────────────┘

原因说明

Polars新版本强化了类型一致性校验:

  • 直接引用pl.col("value")返回的是标量列(i64类型),无法直接作为List类型列返回
  • 必须通过agg()(全局聚合)或list().over(...)(窗口聚合)显式将多个标量值合并为List类型,才能满足Schema要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:12:39