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

在Polars中如何实现唯一行累计计数?现有方法结果不符

问题分析与解决

你的代码逻辑是对每个由A,B,C,D组成的唯一分组,按行的出现顺序生成从1开始的累计计数,这也是cum_count().over(['A','B','C','D'])的默认行为——在每个分组内,从第一行到最后一行依次累加计数,所以会得到你给出的expected列结果。

你忽略的核心点是:cum_count().over(...)的累计范围是分组内的所有行,而你想要的actual列结果,只有(1,0,0,0)这个分组的计数不符合常规累计逻辑(第二次出现仍为1,第三次才变为2),其他分组(如(1,1,0,0))的计数和常规累计一致。

常规唯一行累计计数(对应你的expected列)

如果你的真实需求是统计到当前行为止,每个唯一行的出现次数,那你的代码是正确的,可简化为无需额外的ones列:

df = df.with_columns(
    pl.cum_count().over(['A', 'B', 'C', 'D']).alias("cum_count")
)

匹配actual列的特殊逻辑

如果确实需要得到actual列的结果,结合现有数据来看,唯一的特殊规则仅针对(1,0,0,0)分组,这可能是笔误。如果是想要连续重复行每两次才增加计数,可使用以下代码,但注意这仅匹配你给出的actual列部分结果:

df = df.with_columns(
    cum_count=pl.cum_count().over(['A', 'B', 'C', 'D']),
    actual=pl.when(pl.struct(['A','B','C','D']) == (1,0,0,0))
             .then(((pl.col('cum_count') +1)//2))
             .otherwise(pl.col('cum_count'))
)

补充说明

Polars的窗口函数over默认会保留原DataFrame的行顺序,分组内的cum_count是按行出现的先后顺序累加的,这符合常规的“唯一行累计计数”需求。如果你的actual列是预期结果,建议重新确认需求描述或数据是否存在笔误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:05:55