在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
相关产品推荐
相关产品推荐

