示例:

testDf = pl.DataFrame({
    "Date1": ["2024-04-01", "2024-04-06", "2024-04-07", "2024-04-10", "2024-04-11"],
    "Date2": ["2024-04-04", "2024-04-07", "2024-04-09", "2024-04-10", "2024-04-15"],
    "Date3": ["2024-04-07", "2024-04-08", "2024-04-10", "2024-05-15", "2024-04-21"],
    'Value': [10, 15, -20, 5, 30]
}).with_columns(pl.col('Date1').cast(pl.Date),
                pl.col('Date2').cast(pl.Date),
                pl.col('Date3').cast(pl.Date)
                )
shape: (5, 4)
┌────────────┬────────────┬────────────┬───────┐
│ Date1      ┆ Date2      ┆ Date3      ┆ Value │
│ ---        ┆ ---        ┆ ---        ┆ ---   │
│ date       ┆ date       ┆ date       ┆ i64   │
╞════════════╪════════════╪════════════╪═══════╡
│ 2024-04-01 ┆ 2024-04-04 ┆ 2024-04-07 ┆ 10    │
│ 2024-04-06 ┆ 2024-04-07 ┆ 2024-04-08 ┆ 15    │
│ 2024-04-07 ┆ 2024-04-09 ┆ 2024-04-10 ┆ -20   │
│ 2024-04-10 ┆ 2024-04-10 ┆ 2024-05-15 ┆ 5     │
│ 2024-04-11 ┆ 2024-04-15 ┆ 2024-04-21 ┆ 30    │
└────────────┴────────────┴────────────┴───────┘

我想做的是创建一个数据框,其中对于每个'日期1'我将有一个'值'的累积和的列,其中'日期1'='日期2'和'日期1'='日期3'.>< 因此,当'Date1'='2024—04—10'时,总和应为—15,因为前两行'Date3'='2024—04—10',最后一行为'Date2'='2024—04—15'='2024—04—10'.<>

我试过这个:

testDf.group_by(pl.col('Date1'))\
    .agg(pl.col('Value')\
        .filter((pl.col('Date1') >= pl.col('Date2')) & (pl.col('Date1') <= pl.col('Date3')))\
            .sum())
        shape: (5, 2)
┌────────────┬───────┐
│ Date1      ┆ Value │
│ ---        ┆ ---   │
│ date       ┆ i64   │
╞════════════╪═══════╡
│ 2024-04-11 ┆ 0     │
│ 2024-04-06 ┆ 0     │
│ 2024-04-07 ┆ 0     │
│ 2024-04-10 ┆ 5     │
│ 2024-04-01 ┆ 0     │
└────────────┴───────┘

但我想要的结果是:

shape: (5, 2)
┌────────────┬─────┐
│ Date1      ┆ Sum │
│ ---        ┆ --- │
│ date       ┆ i64 │
╞════════════╪═════╡
│ 2024-04-01 ┆ 0   │
│ 2024-04-06 ┆ 10  │
│ 2024-04-07 ┆ 25  │
│ 2024-04-10 ┆ -15 │
│ 2024-04-11 ┆ 5   │
└────────────┴─────┘

推荐答案

我需要再考虑一下,以了解是否有一个完全依赖polars的原生表达式API的解决方案.然而,这里有一个初步的解决方案依赖于沮丧的pl.Expr.map_elements.

(
    testDf
    .with_columns(
        pl.col("Date1")
        .map_elements(
            lambda x: \
                (
                    testDf
                    .filter(
                        pl.col("Date2") <= x,
                        pl.col("Date3") >= x,
                    )
                    .get_column("Value")
                    .sum()
                ),
            return_dtype=pl.Int64
        )
        .alias("Sum")
    )
)
shape: (5, 5)
┌────────────┬────────────┬────────────┬───────┬─────┐
│ Date1      ┆ Date2      ┆ Date3      ┆ Value ┆ Sum │
│ ---        ┆ ---        ┆ ---        ┆ ---   ┆ --- │
│ date       ┆ date       ┆ date       ┆ i64   ┆ i64 │
╞════════════╪════════════╪════════════╪═══════╪═════╡
│ 2024-04-01 ┆ 2024-04-04 ┆ 2024-04-07 ┆ 10    ┆ 0   │
│ 2024-04-06 ┆ 2024-04-07 ┆ 2024-04-08 ┆ 15    ┆ 10  │
│ 2024-04-07 ┆ 2024-04-09 ┆ 2024-04-10 ┆ -20   ┆ 25  │
│ 2024-04-10 ┆ 2024-04-10 ┆ 2024-05-15 ┆ 5     ┆ -15 │
│ 2024-04-11 ┆ 2024-04-15 ┆ 2024-04-21 ┆ 30    ┆ 5   │
└────────────┴────────────┴────────────┴───────┴─────┘

Python相关问答推荐

列表上值总和最多为K(以O(log n))的最大元素数

根据条件将新值添加到下面的行或下面新创建的行中

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

抓取rotowire MLB球员新闻并使用Python形成表格

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

按列分区,按另一列排序

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

在vscode上使用Python虚拟环境时((env))

使用Python更新字典中的值

在Python中使用if else或使用regex将二进制数据如111转换为001""

如何在Python中使用Pandas将R s Tukey s HSD表转换为相关矩阵''

幂集,其中每个元素可以是正或负""""

如何杀死一个进程,我的Python可执行文件以sudo启动?

在Python中控制列表中的数据步长

如何在SQLAlchemy + Alembic中定义一个"Index()",在基表中的列上

Pandas:计数器的滚动和,复位

Polars定制函数返回多列

文本溢出了Kivy的视区

如何将验证器应用于PYDANC2中的EACHY_ITEM?

奇怪的Base64 Python解码