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

如何在Polars中实现类似cumsum的累积集合生成功能(而非数值求和)

如何在Polars中实现类似cumsum的累积集合生成功能(而非数值求和)

太懂你这个需求了!想要复刻cum_sum的累积逻辑,但不是算数值累加,而是每一行生成到当前位置为止的所有元素的集合,关键还得扛得住百万级别的大数据量,绝对不想碰map_elements或者索引这种性能灾难级的操作,毕竟大数据下那些方法慢到让人抓狂!

刚好Polars有原生的高效方案——用cumulative_eval就能完美解决,它是向量化的累积计算接口,完全适配大数据场景,性能拉满。

直接上代码演示:
首先构造你给出的测试数据:

import polars as pl

df = pl.DataFrame({"a": [1, 2, 3, 4]})

然后一行代码生成你要的累积集合:

df = df.with_columns(
    cumulative_set=pl.col("a").cumulative_eval(pl.element().collect()).cast(pl.Set)
)

运行后你会得到完全符合预期的结果:

shape: (4, 2)
┌─────┬─────────────────┐
│ a   ┆ cumulative_set  │
│ --- ┆ ---             │
│ i64 ┆ set[i64]        │
╞═════╪═════════════════╡
│ 1   ┆ {1}             │
│ 2   ┆ {1, 2}          │
│ 3   ┆ {1, 2, 3}       │
│ 4   ┆ {1, 2, 3, 4}    │
└─────┴─────────────────┘

给你拆解下这个逻辑:

  • cumulative_eval会沿着列的方向执行累积计算,每一步都处理从第一行到当前行的所有元素
  • pl.element().collect()把累积窗口内的所有元素收集成一个列表
  • 最后cast(pl.Set)把列表转成集合类型,自动去重(如果你的原始数据有重复值,集合会自动保留唯一值,完全符合你要的效果)

最核心的是,这个方法是纯Polars原生向量化操作,完全没有逐行循环的额外开销,百万级行的数据集跑起来也会非常顺畅,完美匹配你的性能要求。

备注:内容来源于stack exchange,提问作者ClementWalter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:53:00