代码之家  ›  专栏  ›  技术社区  ›  drhagen

引用以前别名的Polar表达式

  •  0
  • drhagen  · 技术社区  · 4 年前

    有没有办法允许Polars中的表达式引用以前的别名表达式?例如,定义两个新列的代码会出错,因为第二个新列引用了第一个:

    import polars as pl
    
    df = pl.DataFrame(dict(x=[0, 0, 1]))
    
    df.select([
      (pl.col('x') + 1).alias('y'),
      (pl.col('y') * 2).alias('z')],
    )
    # pyo3_runtime.PanicException: called `Result::unwrap()` on an `Err` value:
    # NotFound("Unable to get field named \"y\". Valid fields: [\"x\"]")
    

    该错误表明,失败是由第一个别名对第二个表达式不可见引起的。有没有一种简单的方法可以做到这一点?

    1 回复  |  直到 4 年前
        1
  •  4
  •   ritchie46    4 年前

    上下文 并行执行。因此,它们不能引用一个还不存在的列。

    上下文是:

    • df.with_columns
    • df.select
    • df.groupby(..).agg

    这意味着您需要对引用其他表达式输出的表达式强制执行顺序。

    在你的情况下,我会:

    (df.with_column(
           (pl.col('x') + 1).alias('y')
        ).select([
           pl.col('y'),
          (pl.col('y') * 2).alias('z')
    ]))
    
        2
  •  0
  •   drhagen    4 年前

    一种解决方法是将每个新列都拉到自己的列中 with_column 打电话然后做期末考试 select 以保留您应该保留的列。你可能会想确保这是懒惰地完成。

    import polars as pl
    
    df = pl.DataFrame(dict(x=[0, 0, 1]))
    
    (df
      .lazy()
      .with_column((pl.col("x") + 1).alias("y"))
      .with_column((pl.col("y") * 2).alias("z"))
      .select(["y", "z"])
      .collect()
    )
    # shape: (3, 2)
    # ┌─────┬─────┐
    # │ y   ┆ z   │
    # │ --- ┆ --- │
    # │ i64 ┆ i64 │
    # ╞═════╪═════╡
    # │ 1   ┆ 2   │
    # ├╌╌╌╌╌┼╌╌╌╌╌┤
    # │ 1   ┆ 2   │
    # ├╌╌╌╌╌┼╌╌╌╌╌┤
    # │ 2   ┆ 4   │
    # └─────┴─────┘