Python Polars窗口函数结合字面量实现分组累计计数问题
更优实现方法
直接用Polars内置的row_number()窗口函数,一步就能生成分组累计计数:
df.with_columns(pl.row_number().over("id").alias("count"))
这个方法不需要临时列,代码简洁高效,row_number()会自动在每个id分组内从1开始递增计数,完全匹配你的需求。
你的写法问题分析
你尝试的第二种写法报错,核心原因是:
pl.lit(1)是单个标量值(长度为1),当直接对它调用.cum_sum().over("id")时,窗口函数会尝试在每个分组内对这个标量做累计求和,但标量的长度和分组的实际行数不匹配(比如id=1的分组有3行,标量却只有1个值),因此触发了ComputeError。- 而第一种写法先通过
.with_columns(pl.lit(1).alias("ones"))把标量广播成和DataFrame行数一致的列,此时ones列是每行都为1的完整列,再对它做分组累计求和就没问题——因为列的长度和每个分组的行数完全匹配。
如果不想用row_number(),也可以优化第一种写法,合并两个with_columns步骤:
df.with_columns( pl.lit(1).repeat(len(df)).cum_sum().over("id").alias("count") )
但显然row_number()是最简洁的方案。
内容的提问来源于stack exchange,提问作者bkw1491
相关产品推荐
相关产品推荐

