如何在Python Polars中转换表达式元数据的根名称(root_names)?
如何在Python Polars中转换表达式元数据的根名称(root_names)?
当然可以做到啦!Polars目前没有直接提供修改表达式root_names的现成API,但我们可以通过表达式重写的思路来实现这个需求——说白了就是遍历表达式的结构,把涉及到的列名和别名都替换成带后缀的版本。
这里给你一个实用的递归函数,能帮你自动处理这类列名替换:
import polars as pl def rename_root_cols(expr: pl.Expr, suffix: str) -> pl.Expr: # 处理列引用(pl.col创建的表达式) if isinstance(expr, pl.expr.col.Col): return pl.col(f"{expr.name}{suffix}") # 处理别名(.alias()生成的表达式) elif isinstance(expr, pl.expr.wrap.Alias): # 先递归修改内部的表达式 renamed_inner = rename_root_cols(expr.inner, suffix) # 再给别名加上后缀 return renamed_inner.alias(f"{expr.alias}{suffix}") # 处理包含子表达式的操作(比如dot、add、mul等) elif hasattr(expr, "_inputs"): # 递归修改所有子表达式 new_inputs = [rename_root_cols(sub_expr, suffix) for sub_expr in expr._inputs] # 用修改后的子表达式重新构造原表达式 return type(expr)(*new_inputs, **expr._kwargs) # 其他不需要修改的表达式类型直接返回 else: return expr
接下来用你的例子测试一下:
# 原表达式 original_expr = pl.col("A").dot(pl.col("B")).alias("AdotB") # 添加_suffix后缀 renamed_expr = rename_root_cols(original_expr, "_suffix") # 查看结果 print(renamed_expr) # 输出:col("A_suffix").dot(col("B_suffix")).alias("AdotB_suffix")
简单解释下这个函数的逻辑:
- 首先识别
pl.col创建的列引用,直接给列名加上后缀; - 遇到
.alias()生成的别名表达式时,先修改内部的表达式内容,再给别名本身加后缀; - 对于像
dot这种包含子表达式的操作,递归修改所有子部分后,用原表达式的类型重新构造,保证操作逻辑不变; - 其他不涉及列名的表达式(比如常量、聚合函数等)会直接返回,不做改动。
如果你的需求里不需要修改别名,只改根列名的话,只要把函数里处理Alias的代码块删掉就可以啦!
备注:内容来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

