显示了一个K=2的玩具示例,但该问题主要与高g基数和K>>1相关:

df = pl.DataFrame(dict(
    g=[1, 2, 1, 2, 1, 2],
    v=[1, 2, 3, 4, 5, 6],
))

K = 2

df.with_columns((col.v.shift(k+1).over('g').alias(f's{k}') for k in range(K)))
╭─────┬─────┬──────┬──────╮
│   g ┆   v ┆   s0 ┆   s1 │
│ i64 ┆ i64 ┆  i64 ┆  i64 │
╞═════╪═════╪══════╪══════╡
│   1 ┆   1 ┆ null ┆ null │
│   2 ┆   2 ┆ null ┆ null │
│   1 ┆   3 ┆    1 ┆ null │
│   2 ┆   4 ┆    2 ┆ null │
│   1 ┆   5 ┆    3 ┆    1 │
│   2 ┆   6 ┆    4 ┆    2 │
╰─────┴─────┴──────┴──────╯

我如何才能确保按g分组只进行一次?

在查询计划中,Polars似乎没有针对此进行优化.

我预计它的运行速度是:

df.group_by('g').agg((col.v.shift(k+1).alias(f's{k}') for k in range(K)))

推荐答案

Polars缓存窗口表达式.虽然您可能在查询计划中看不到这一点,但over分组只进行一次.

但是,over查询的运行速度不会像group_by查询那么快.这是因为over必须将结果添加回原始数据帧.

更公平的比较是下面的查询,它将与over查询的结果相匹配.如您所见,还需要额外的join个.

import polars as pl

df = pl.DataFrame(
    {
        "g": [1, 2, 1, 2, 1, 2],
        "v": [1, 2, 3, 4, 5, 6],
    }
)
K = 2

df_shift = (
    df.group_by("g")
    .agg([pl.col("v")] + [pl.col("v").shift(k + 1).alias(f"s{k}") for k in range(K)])
    .explode(["v"] + [f"s{k}" for k in range(K)])
)
result = df.join(df_shift, on=["g", "v"], how="left")
print(result)
shape: (6, 4)
┌─────┬─────┬──────┬──────┐
│ g   ┆ v   ┆ s0   ┆ s1   │
│ --- ┆ --- ┆ ---  ┆ ---  │
│ i64 ┆ i64 ┆ i64  ┆ i64  │
╞═════╪═════╪══════╪══════╡
│ 1   ┆ 1   ┆ null ┆ null │
│ 2   ┆ 2   ┆ null ┆ null │
│ 1   ┆ 3   ┆ 1    ┆ null │
│ 2   ┆ 4   ┆ 2    ┆ null │
│ 1   ┆ 5   ┆ 3    ┆ 1    │
│ 2   ┆ 6   ┆ 4    ┆ 2    │
└─────┴─────┴──────┴──────┘

Python相关问答推荐

try 从网站获取表(ValueRight:如果使用所有纯量值,则必须传递索引)

带有计数值的Pandas数据帧

隐藏QComboBox的指示器(qdarkstyle)

合并其中一个具有重叠范围的两个框架的最佳方法是什么?

Flask:如何在完整路由代码执行之前返回验证

使用Python OpenCV的文本检测分割

如何将新的SQL服务器功能映射到SQL Alchemy的ORM

无法导入已安装的模块

Python无法在已导入的目录中看到新模块

使用SciPy进行曲线匹配未能给出正确的匹配

如何使用pandasDataFrames和scipy高度优化相关性计算

在Python中处理大量CSV文件中的数据

如何删除索引过go 的lexsort深度可能会影响性能?' &>

如果值发生变化,则列上的极性累积和

形状弃用警告与组合多边形和多边形如何解决

当点击tkinter菜单而不是菜单选项时,如何执行命令?

Django—cte给出:QuerySet对象没有属性with_cte''''

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

使用Python查找、替换和调整PDF中的图像'

如何使用两个关键函数来排序一个多索引框架?