Polars 选择上下文中引用早期别名的表达式

drh*_*gen 3 python-polars

有没有办法允许 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\"]")
Run Code Online (Sandbox Code Playgroud)

该错误表明失败是由于第一个别名对第二个表达式不可见而导致的。有没有一种简单的方法可以让这项工作发挥作用?

rit*_*e46 5

上下文中的所有极坐标表达式都是并行执行的。因此它们不能引用尚不存在的列。

上下文是:

  • 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')
]))
Run Code Online (Sandbox Code Playgroud)