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

如何在Polars中基于多列字符串格式化新增列并保留原数据

在Polars中基于多列完成字符串格式化并保留原列

先明确你的原始数据和需求:

原始DataFrame定义

import polars as pl

df = pl.DataFrame({
    'schema_name': ['test_schema', 'test_schema_2'], 
    'table_name': ['test_table', 'test_table_2'],
    'column_name': ['test_column, test_column_2','test_column']
})

字符串模板

date_field_value_max_query = '''
    select '{0}' as schema_name, 
           '{1}' as table_name, 
           greatest({2})
    from {0}.{1}
    group by 1, 2
'''

你提到用map_rows会丢失原列且不推荐,确实map_rows更适合处理复杂行逻辑,并非这个场景的最优解。Polars推荐用向量化操作来处理这类需求,既高效又能完美保留原列,下面给你两种实用方法:


方法一:使用Polars原生pl.format(推荐,性能最优)

pl.format是Polars专门为向量化字符串格式化设计的函数,直接接收列作为参数逐行填充模板,再通过with_columns把新列附加到原DataFrame:

df_with_query = df.with_columns(
    pl.format(
        date_field_value_max_query,
        pl.col("schema_name"),
        pl.col("table_name"),
        pl.col("column_name")
    ).alias("query")
)

这个方法完全贴合Polars的设计理念,向量化操作比行遍历快得多,而且with_columns会自动保留所有原始列,生成的df_with_query就是你要的目标DataFrame。


方法二:结合struct和map_elements(适合复杂自定义逻辑)

如果你的模板逻辑更复杂,需要用到Python原生format,可以先把需要的列打包成struct,再用map_elements处理,同样用with_columns保留原列:

df_with_query = df.with_columns(
    pl.struct(["schema_name", "table_name", "column_name"])
    .map_elements(lambda row: date_field_value_max_query.format(*row.values()), return_dtype=pl.Utf8)
    .alias("query")
)

这里我们把三个列打包成结构体,遍历每个结构体并解包值传给format,最后指定返回字符串类型,同样能得到包含原列和query列的结果。


为什么map_rows不行?

map_rows的返回值是一个新的Series(或迭代器),不会自动和原DataFrame合并,因此会丢失原列。而with_columns是Polars中添加新列的标准方式,会在原DataFrame基础上追加新列,完全满足你的需求。

运行上述代码后,你会得到包含原三列和query列的目标DataFrame,每一行的query都是对应格式化后的SQL语句。

内容的提问来源于stack exchange,提问作者OverflowingTheGlass

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:22:53