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

Polars从立即执行转延迟执行时触发ColumnNotFoundError问题咨询

Polars延迟执行模式下map_groups后找不到生成列的问题

问题原因

这段代码在立即执行模式正常运行,但切换到延迟执行时抛出ColumnNotFoundError,核心原因是延迟执行依赖明确的查询计划,而map_groups中动态生成的列无法被Polars提前推断。立即执行是实时计算生成列,后续步骤能直接读取;但延迟执行先构建完整查询计划,Polars无法预知lambda会生成A_lag_0/1/2这些列,导致后续with_columns引用时报错。

解决方案

方案1:显式指定map_groups的schema

给map_groups传入明确的schema定义,让Polars提前知晓输出列结构,即可正常构建查询计划:

import polars as pl 

df = pl.DataFrame({
     'A':[1,2,3,3,2,1],
     'B':[1,1,1,2,2,2]
})

(df
 .lazy()
 .group_by('B')
 .map_groups(
     lambda x: x.with_columns(pl.col("A").shift(i).alias(f"A_lag_{i}") for i in range(3)),
     # 显式声明输出schema:包含原列和所有新生成列
     schema={'A': pl.Int64, 'B': pl.Int64, 'A_lag_0': pl.Int64, 'A_lag_1': pl.Int64, 'A_lag_2': pl.Int64}
 )
 .with_columns(pl.col(f'A_lag_{i}') / pl.col('A') for i in range(3))
 .collect()
)

方案2:将后续计算逻辑移入map_groups内部

把生成延迟列和除法计算都封装到map_groups的lambda中,避免在外部引用动态生成的列:

import polars as pl 

df = pl.DataFrame({
     'A':[1,2,3,3,2,1],
     'B':[1,1,1,2,2,2]
})

(df
 .lazy()
 .group_by('B')
 .map_groups(
     lambda x: x.with_columns(
         pl.col("A").shift(i).alias(f"A_lag_{i}") for i in range(3)
     ).with_columns(
         pl.col(f'A_lag_{i}') / pl.col('A') for i in range(3)
     ),
     schema=None
 )
 .collect()
)

补充说明

延迟执行模式下使用schema=None时,Polars会尝试自动推断输出schema,但动态生成列的场景下推断逻辑失效。因此要么显式指定schema,要么把相关计算都封装到map_groups内部,即可解决该问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:01:21