就说我有

df1 = pl.DataFrame({'start': [1., 2., 4.], 'end': [2, 4., 6]})
df2 = pl.DataFrame({'idx': [1, 1.7, 2.3, 2.5, 3., 4], 'values': [3, 1, 4, 2, 3, 5]})

它们看起来是这样的:

In [8]: df1
Out[8]:
shape: (3, 2)
┌───────┬─────┐
│ start ┆ end │
│ ---   ┆ --- │
│ f64   ┆ f64 │
╞═══════╪═════╡
│ 1.0   ┆ 2.0 │
│ 2.0   ┆ 4.0 │
│ 4.0   ┆ 6.0 │
└───────┴─────┘

In [9]: df2
Out[9]:
shape: (6, 2)
┌─────┬────────┐
│ idx ┆ values │
│ --- ┆ ---    │
│ f64 ┆ i64    │
╞═════╪════════╡
│ 1.0 ┆ 3      │
│ 1.7 ┆ 1      │
│ 2.3 ┆ 4      │
│ 2.5 ┆ 2      │
│ 3.0 ┆ 3      │
│ 4.0 ┆ 5      │
└─────┴────────┘

我想以这样的方式结束:

In [6]: expected = pl.DataFrame({
   ...:     'start': [1., 2., 4.],
   ...:     'end': [2., 4.5, 6.],
   ...:     'sum_values': [4, 9, 5]
   ...: })

In [7]: expected
Out[7]:
shape: (3, 3)
┌───────┬─────┬────────────┐
│ start ┆ end ┆ sum_values │
│ ---   ┆ --- ┆ ---        │
│ f64   ┆ f64 ┆ i64        │
╞═══════╪═════╪════════════╡
│ 1.0   ┆ 2.0 ┆ 4          │
│ 2.0   ┆ 4.5 ┆ 9          │
│ 4.0   ┆ 6.0 ┆ 5          │
└───────┴─────┴────────────┘

以下是我想出的一种低效方法,使用apply:

(
    df1.with_columns(
        df1.apply(
            lambda row: df2.filter(
                pl.col("idx").is_between(row[0], row[1], closed="left")
            )["values"].sum()
        )["apply"].alias("sum_values")
    )
)

它给出了正确的输出,但是因为它使用了apply和一个Python lambda函数,所以它的性能不是很好.

有没有办法使用Polars原生表达式API来编写?

推荐答案

除了交叉连接之外,我不确定是否还有其他方法:

(df1.join(df2, how='cross')
    .filter(pl.col('idx').is_between('start', 'end', closed='left'))
    .groupby('start', 'end')
    .sum()
)
shape: (3, 4)
┌───────┬─────┬─────┬────────┐
│ start ┆ end ┆ idx ┆ values │
│ ---   ┆ --- ┆ --- ┆ ---    │
│ f64   ┆ f64 ┆ f64 ┆ i64    │
╞═══════╪═════╪═════╪════════╡
│ 4.0   ┆ 6.0 ┆ 4.0 ┆ 5      │
│ 1.0   ┆ 2.0 ┆ 2.7 ┆ 4      │
│ 2.0   ┆ 4.0 ┆ 7.8 ┆ 9      │
└───────┴─────┴─────┴────────┘

Python相关问答推荐

将numpy矩阵映射到字符串矩阵

使用GEKKO在简单DTE系统中进行一致初始化

大Pandas 胚胎中产生组合

TARete错误:类型对象任务没有属性模型'

当多个值具有相同模式时返回空

标题:如何在Python中使用嵌套饼图可视化分层数据?

为什么符号没有按顺序添加?

为什么抓取的HTML与浏览器判断的元素不同?

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?

启动带有参数的Python NTFS会导致文件路径混乱

为什么\b在这个正则表达式中不解释为反斜杠

旋转多边形而不改变内部空间关系

如何在一组行中找到循环?

数据框,如果值在范围内,则获取范围和

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

合并相似列表

Python协议不兼容警告

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

Regex用于匹配Python中逗号分隔的AWS区域