我想创建一个列,它是一个组列的累积和,但累积和只发生在'天'列满足一定的条件.我想出了一个我认为是"胶带"的解决方案,一定有一个更优雅的方式.

import polars as pl

# Create a DataFrame with literal values
df = pl.DataFrame({
    "days": [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 6, 7, 1],
    "amount": [100, 200, 150, 300, 250, 180, 220, 280, 210, 320,21,456,111],
    "group": ["A", "B", "A", "C", "B", "A", "C", "B", "C", "A","C","B","B"]
})

# Display the DataFrame
print(df)

#My duct tape solution
df = (
    df
    .with_columns(
        pl.when(pl.col("days") > 2)
        .then(pl.col("amount"))
        .otherwise(0).alias("3+days_amount")
                  )
    .with_columns(
        pl.col("3+days_amount").cum_sum().over("group").alias("group_cumsum")
    )
)

print(df)

shape: (13, 3)
┌──────┬────────┬───────┐
│ days ┆ amount ┆ group │
│ ---  ┆ ---    ┆ ---   │
│ i64  ┆ i64    ┆ str   │
╞══════╪════════╪═══════╡
│ 0    ┆ 100    ┆ A     │
│ 1    ┆ 200    ┆ B     │
│ 2    ┆ 150    ┆ A     │
│ 3    ┆ 300    ┆ C     │
│ 4    ┆ 250    ┆ B     │
│ …    ┆ …      ┆ …     │
│ 3    ┆ 210    ┆ C     │
│ 4    ┆ 320    ┆ A     │
│ 6    ┆ 21     ┆ C     │
│ 7    ┆ 456    ┆ B     │
│ 1    ┆ 111    ┆ B     │
└──────┴────────┴───────┘
shape: (13, 5)
┌──────┬────────┬───────┬───────────────┬──────────────┐
│ days ┆ amount ┆ group ┆ 3+days_amount ┆ group_cumsum │
│ ---  ┆ ---    ┆ ---   ┆ ---           ┆ ---          │
│ i64  ┆ i64    ┆ str   ┆ i64           ┆ i64          │
╞══════╪════════╪═══════╪═══════════════╪══════════════╡
│ 0    ┆ 100    ┆ A     ┆ 0             ┆ 0            │
│ 1    ┆ 200    ┆ B     ┆ 0             ┆ 0            │
│ 2    ┆ 150    ┆ A     ┆ 0             ┆ 0            │
│ 3    ┆ 300    ┆ C     ┆ 300           ┆ 300          │
│ 4    ┆ 250    ┆ B     ┆ 250           ┆ 250          │
│ …    ┆ …      ┆ …     ┆ …             ┆ …            │
│ 3    ┆ 210    ┆ C     ┆ 210           ┆ 510          │
│ 4    ┆ 320    ┆ A     ┆ 320           ┆ 320          │
│ 6    ┆ 21     ┆ C     ┆ 21            ┆ 531          │
│ 7    ┆ 456    ┆ B     ┆ 456           ┆ 706          │
│ 1    ┆ 111    ┆ B     ┆ 0             ┆ 706          │
└──────┴────────┴───────┴───────────────┴──────────────┘

一般来说,极点的表达看起来非常优雅,希望有我遗漏的东西.

推荐答案

正如@jqury所提到的,可以使用单个pl.DataFrame.with_columns调用来计算条件累积和.

此外,通过将金额与条件相乘,可以在没有构造pl.when().then().otherwise()的情况下计算条件金额.

(
    df
    .with_columns(
        (pl.col("amount") * (pl.col("days") > 2)).cum_sum().over("group").alias("group_sum")
    )
)

Python相关问答推荐

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

删除最后一个pip安装的包

基于索引值的Pandas DataFrame条件填充

Pandas GroupBy可以分成两个盒子吗?

在matplotlib中删除子图之间的间隙_mosaic

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

在pandas/python中计数嵌套类别

Polars map_使用多处理对UDF进行批处理

如何在GEKKO中使用复共轭物

计算机找不到已安装的库'

你能把函数的返回类型用作其他地方的类型吗?'

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

如何用FFT确定频变幅值

在round函数中使用列值

如何在Python中解析特定的文本,这些文本包含了同一行中的所有内容,

设置索引值每隔17行左右更改的索引

如何使用Polars从AWS S3读取镶木地板文件

根据边界点的属性将图划分为子图