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

Polars中按组添加行号:无需先创建全1列的实现方法

优化Polars按组生成行号的方法

合并两步with_columns为一步

你可以直接在单个with_columns调用中完成逻辑,不需要预先创建全1列,用pl.lit(1)生成临时的全1序列即可:

import polars as pl

df = pl.DataFrame({
    'g': [0, 0, 0, 1, 1, 1, 2, 2, 2, 3],
    'j': [37, 87, 56, 28, 49, 65, 37, 91, 45, 95]
})

df = df.with_columns(
    rn=pl.lit(1).shift().fill_null(0).cum_sum().over('g')
)

执行结果和原代码完全一致:

┌─────┬─────┬─────┐
│ g   ┆ j   ┆ rn  │
│ --- ┆ --- ┆ --- │
│ u32 ┆ i64 ┆ i32 │
╞═════╪═════╪═════╡
│ 0   ┆ 37  ┆ 0   │
│ 0   ┆ 87  ┆ 1   │
│ 0   ┆ 56  ┆ 2   │
│ 1   ┆ 28  ┆ 0   │
│ 1   ┆ 49  ┆ 1   │
│ 1   ┆ 65  ┆ 2   │
│ 2   ┆ 37  ┆ 0   │
│ 2   ┆ 91  ┆ 1   │
│ 2   ┆ 45  ┆ 2   │
│ 3   ┆ 95  ┆ 0   │
└─────┴─────┴─────┘

更简洁的原生方案

Polars提供了原生的row_number()函数,专门用于生成行号。它默认从1开始计数,若要匹配原代码从0开始的结果,只需对结果减1:

df = df.with_columns(
    rn=pl.row_number().over('g') - 1
)

这个方法代码更简洁、可读性更强,是Polars官方推荐的实现方式,性能也更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:27:15