Polars中horizontal cumulative sum结合unnest出现literal列残留Bug
Polars v1.31.0中横向累积求和+unnest操作的"literal"列Bug分析
这是Polars的Bug,并非操作不当导致。
问题原因
pl.cum_sum_horizontal()的内部处理逻辑存在错误:
- 执行该函数并对结果
unnest后,Schema中会错误地生成一个不存在的literal列; - 即使显式调用
drop("literal")移除该列,LazyFrame的执行计划中仍残留对literal列的引用,最终collect时触发ColumnNotFoundError。
从复现输出能明显看到:
- unnest+rename后的Schema包含
literal列,但实际数据中无此列; - 删除
literal后Schema显示已移除,但执行collect仍报错,说明逻辑计划未正确清除依赖。
临时解决方案
方案1:先转为DataFrame再处理
通过提前collect打断LazyFrame链式操作,避免逻辑计划残留错误依赖:
result = ( lazy_df.select(pl.cum_sum_horizontal(time_cols)) .collect() # 先转换为DataFrame .unnest("cum_sum") .rename({col: f"C{col}" for col in time_cols}) .lazy() # 按需转回LazyFrame )
方案2:直接生成命名的累积列
跳过unnest步骤,手动构造每个累积求和列并命名:
result = lazy_df.select( [pl.cum_sum_horizontal(time_cols[:i+1]).alias(f"C{time_cols[i]}") for i in range(len(time_cols))] )
内容的提问来源于stack exchange,提问作者Nicolò Cavalleri
相关产品推荐
相关产品推荐

