在Polars中能否在后续表达式中使用新创建的变量?
在Polars中实现类似dplyr mutate的链式变量引用
Polars的
with_columns在单次调用里,所有列表达式都是基于原始DataFrame计算的,新创建的列无法被同一次调用里的后续表达式识别——这就是你触发ColumnNotFoundError的原因。和R中dplyr的mutate按顺序执行、允许直接引用刚生成的变量逻辑不同。要实现类似dplyr的效果,有两种常用方法:
- 拆分链式调用
with_columns:把每个新列的创建拆成独立的with_columns调用,这样后续调用就能引用前一步生成的列。示例代码:import polars as pl df = pl.DataFrame({"nrs": [1, 2, 3]}) df = ( df.with_columns((pl.col("nrs") + 1).alias("nrs+1")) .with_columns((pl.col("nrs+1") + 1).alias("nrs+2")) ) - 使用
select实现顺序引用:Polars的select支持在同一调用里引用前面定义的列别名,用这种方式可以在单次调用内完成递进计算。示例代码:import polars as pl df = pl.DataFrame({"nrs": [1, 2, 3]}) df = df.select( pl.all(), (pl.col("nrs") + 1).alias("nrs+1"), (pl.col("nrs+1") + 1).alias("nrs+2") )
- 拆分链式调用
补充:如果是复杂多步计算,链式
with_columns的可读性更好;简单递进计算则用select更简洁。Polars的设计优先考虑批量计算的性能优化,所以默认不支持同一with_columns内的顺序引用,但通过上述方法完全可以实现和dplyr mutate一致的效果。
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

