Python Polars:按用户组统计至下次登录的剩余行数
实现Polars用户下次登录剩余行数统计
核心思路是通过分组窗口函数结合反向计算,先标记登录行位置,再统计每行到下一个登录行的行数差,最后处理最后一次登录后的行。
具体代码实现
import polars as pl data = pl.DataFrame({"user_id": [1, 1, 1, 2, 2, 2], "login": [False, True, False, False, False, True]}) result = data.with_columns( pl.when(pl.col("login")) .then(0) .otherwise( pl.col("login") .cum_sum(reverse=True) .over("user_id") .pipe(lambda s: s - s.shift(-1)) ) .when(pl.col("login").cum_sum(reverse=True).over("user_id") == 0) .then(None) .alias("days_to_next_login") ) print(result)
代码逻辑说明
- 用
cum_sum(reverse=True).over("user_id")反向统计每个用户的登录累计数,累计数为0的行就是最后一次登录后的行。 - 通过
s - s.shift(-1)计算当前行到下一个登录行的行数差,登录行直接设为0。 - 最后用
when条件把累计数为0的行设为None。
输出结果
shape: (6, 3) ┌─────────┬───────┬──────────────────┐ │ user_id ┆ login ┆ days_to_next_login │ │ --- ┆ --- ┆ --- │ │ i64 ┆ bool ┆ i64 │ ╞═════════╪═══════╪══════════════════╡ │ 1 ┆ false ┆ 1 │ │ 1 ┆ true ┆ 0 │ │ 1 ┆ false ┆ null │ │ 2 ┆ false ┆ 2 │ │ 2 ┆ false ┆ 1 │ │ 2 ┆ true ┆ 0 │ └─────────┴───────┴──────────────────┘
内容的提问来源于stack exchange,提问作者cdkdrf
相关产品推荐
相关产品推荐

