You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:48:06