我有以下数据框:

df = pl.DataFrame({
    "Column A": [2, 3, 1, 4, 1, 3, 3, 2, 1, 0],
    "Column B": [
        "Life", None, None, None, "Death", None, 
        "Life", None, None, "Death"
    ]
})
shape: (10, 2)
┌──────────┬──────────┐
│ Column A ┆ Column B │
│ ---      ┆ ---      │
│ i64      ┆ str      │
╞══════════╪══════════╡
│ 2        ┆ Life     │
│ 3        ┆ null     │
│ 1        ┆ null     │
│ 4        ┆ null     │
│ 1        ┆ Death    │
│ 3        ┆ null     │
│ 3        ┆ Life     │
│ 2        ┆ null     │
│ 1        ┆ null     │
│ 0        ┆ Death    │
└──────────┴──────────┘

我想创建一个新列,我们称它为C列.对于B列是‘Life’的每一行,C列应该具有从该行到B列是‘Death’的A列的值范围内的最大值.如果B栏不是‘Life’,则C栏应设置为‘None’

最终结果应该如下所示:

shape: (10, 3)
┌──────────┬──────────┬──────────┐
│ Column A ┆ Column B ┆ Column C │
│ ---      ┆ ---      ┆ ---      │
│ i64      ┆ str      ┆ f64      │
╞══════════╪══════════╪══════════╡
│ 2        ┆ Life     ┆ 4.0      │
│ 3        ┆ null     ┆ null     │
│ 1        ┆ null     ┆ null     │
│ 4        ┆ null     ┆ null     │
│ 1        ┆ Death    ┆ null     │
│ 3        ┆ null     ┆ null     │
│ 3        ┆ Life     ┆ 3.0      │
│ 2        ┆ null     ┆ null     │
│ 1        ┆ null     ┆ null     │
│ 0        ┆ Death    ┆ null     │
└──────────┴──────────┴──────────┘

我如何在Python中使用Polars来实现这一点?如有任何帮助或建议,我们将不胜感激!

推荐答案

我认为一般的 idea 是 for each "范围"分配"组ID".

一种常见的方法是使用累积和和远期填充.

(
    df.with_columns(
        start = (pl.col("Column B") == "Life").cum_sum().forward_fill(),
        end = (pl.col("Column B") == "Death").cum_sum().forward_fill()
    )
    .with_columns(
        group_id_1 = pl.col("start") + pl.col("end")
    )
    .with_columns(
        group_id_2 = 
            pl.when(pl.col("Column B") == "Death")
              .then(None)
              .otherwise(pl.col("group_id_1"))
              .forward_fill()
    )
)
shape: (10, 6)
┌──────────┬──────────┬───────┬─────┬────────────┬────────────┐
│ Column A ┆ Column B ┆ start ┆ end ┆ group_id_1 ┆ group_id_2 │
│ ---      ┆ ---      ┆ ---   ┆ --- ┆ ---        ┆ ---        │
│ i64      ┆ str      ┆ u32   ┆ u32 ┆ u32        ┆ u32        │
╞══════════╪══════════╪═══════╪═════╪════════════╪════════════╡
│ 2        ┆ Life     ┆ 1     ┆ 0   ┆ 1          ┆ 1          │
│ 3        ┆ null     ┆ 1     ┆ 0   ┆ 1          ┆ 1          │
│ 1        ┆ null     ┆ 1     ┆ 0   ┆ 1          ┆ 1          │
│ 4        ┆ null     ┆ 1     ┆ 0   ┆ 1          ┆ 1          │
│ 1        ┆ Death    ┆ 1     ┆ 1   ┆ 2          ┆ 1          │ # 2 -> 1
│ 3        ┆ null     ┆ 1     ┆ 1   ┆ 2          ┆ 2          │
│ 3        ┆ Life     ┆ 2     ┆ 1   ┆ 3          ┆ 3          │
│ 2        ┆ null     ┆ 2     ┆ 1   ┆ 3          ┆ 3          │
│ 1        ┆ null     ┆ 2     ┆ 1   ┆ 3          ┆ 3          │
│ 0        ┆ Death    ┆ 2     ┆ 2   ┆ 4          ┆ 3          │ # 4 -> 3
└──────────┴──────────┴───────┴─────┴────────────┴────────────┘

除了死刑犯之外,group_id_1得到了大部分的结果,死刑犯需要修正才能得到group_id_2

由于它足够复杂,您可能希望使用变量和/或函数来构建最终表达式:

start = pl.col("Column B") == "Life"
end = pl.col("Column B") == "Death"

group_id = (
   pl.when(end)
     .then(None)
     .otherwise((start.cum_sum().forward_fill() + end.cum_sum()).forward_fill())
     .forward_fill()
)

df.with_columns(
   pl.when(start) 
     .then(pl.col("Column A").max())
     .over(group_id)
     .alias("Column C")
)
shape: (10, 3)
┌──────────┬──────────┬──────────┐
│ Column A ┆ Column B ┆ Column C │
│ ---      ┆ ---      ┆ ---      │
│ i64      ┆ str      ┆ i64      │
╞══════════╪══════════╪══════════╡
│ 2        ┆ Life     ┆ 4        │
│ 3        ┆ null     ┆ null     │
│ 1        ┆ null     ┆ null     │
│ 4        ┆ null     ┆ null     │
│ 1        ┆ Death    ┆ null     │
│ 3        ┆ null     ┆ null     │
│ 3        ┆ Life     ┆ 3        │
│ 2        ┆ null     ┆ null     │
│ 1        ┆ null     ┆ null     │
│ 0        ┆ Death    ┆ null     │
└──────────┴──────────┴──────────┘

Python相关问答推荐

如何比较numPy数组中的两个图像以获取它们不同的像素

处理(潜在)不断增长的任务队列的并行/并行方法

通过Selenium从页面获取所有H2元素

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

将tdqm与cx.Oracle查询集成

海上重叠直方图

在含噪声的3D点网格中识别4连通点模式

手动设置seborn/matplotlib散点图连续变量图例中显示的值

如何获取Python synsets列表的第一个内容?

Pandas:填充行并删除重复项,但保留不同的值

Odoo16:模板中使用的docs变量在哪里定义?

30个非DATETIME天内的累计金额

如何将一组组合框重置回无 Select tkinter?

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

504未连接IB API TWS错误—即使API连接显示已接受''

如何写一个polars birame到DuckDB

在round函数中使用列值

我可以同时更改多个图像吗?

如何通过函数的强式路径动态导入函数?