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
相关产品推荐
相关产品推荐

