当我从急切执行转换为惰性执行时,Polars 抛出错误

问题描述 投票:0回答:1

此代码有效并返回预期结果。

import polars as pl 

df = pl.DataFrame({
     'A':[1,2,3,3,2,1],
     'B':[1,1,1,2,2,2]
})

(df
 #.lazy()
 .group_by('B')
 .map_groups(lambda x: 
     x.with_columns(
         pl.col("A").shift(i).alias(f"A_lag_{i}") for i in range(3)
     ),
     #schema=None
 
 )
 .with_columns(
     pl.col(f'A_lag_{i}') / pl.col('A') for i in range(3)
 )
 #.collect()
)

但是,如果您注释掉

.lazy()
schema=None
.collect()
,您会得到
NotFoundError: f'A_lag_0

我已经尝试了此代码的几个版本,但我无法完全理解我是否做错了什么,或者这是否是 Polars 中的错误。

python-polars
1个回答
2
投票

这并不能解决您收到的错误,但在 Polars 中表达此错误的更惯用方法是使用

over
表达式。 例如:

(
    df
    .lazy()
    .with_columns(
        pl.col("A").shift(i).over('B').alias(f"A_lag_{i}")
        for i in range(3))
    .with_columns(
        (pl.col(f"A_lag_{i}") / pl.col("A")).name.suffix('_result')
        for i in range(3))
    .collect()
)

shape: (6, 8)
┌─────┬─────┬─────────┬─────────┬─────────┬────────────┬───────────┬───────────┐
│ A   ┆ B   ┆ A_lag_0 ┆ A_lag_1 ┆ A_lag_2 ┆ A_lag_0_re ┆ A_lag_1_r ┆ A_lag_2_r │
│ --- ┆ --- ┆ ---     ┆ ---     ┆ ---     ┆ sult       ┆ esult     ┆ esult     │
│ i64 ┆ i64 ┆ i64     ┆ i64     ┆ i64     ┆ ---        ┆ ---       ┆ ---       │
│     ┆     ┆         ┆         ┆         ┆ f64        ┆ f64       ┆ f64       │
╞═════╪═════╪═════════╪═════════╪═════════╪════════════╪═══════════╪═══════════╡
│ 1   ┆ 1   ┆ 1       ┆ null    ┆ null    ┆ 1.0        ┆ null      ┆ null      │
│ 2   ┆ 1   ┆ 2       ┆ 1       ┆ null    ┆ 1.0        ┆ 0.5       ┆ null      │
│ 3   ┆ 1   ┆ 3       ┆ 2       ┆ 1       ┆ 1.0        ┆ 0.666667  ┆ 0.333333  │
│ 3   ┆ 2   ┆ 3       ┆ null    ┆ null    ┆ 1.0        ┆ null      ┆ null      │
│ 2   ┆ 2   ┆ 2       ┆ 3       ┆ null    ┆ 1.0        ┆ 1.5       ┆ null      │
│ 1   ┆ 2   ┆ 1       ┆ 2       ┆ 3       ┆ 1.0        ┆ 2.0       ┆ 3.0       │
└─────┴─────┴─────────┴─────────┴─────────┴────────────┴───────────┴───────────┘

© www.soinside.com 2019 - 2024. All rights reserved.