如何在Polars中根据指定列动态拼接对应列的内容
问题解决:Polars动态拼接指定列的值
错误原因
你之前的代码报错是因为pl.col('Columns to Concatenate').str.split(',')返回的是列名字符串的列表,而pl.concat_str需要接收Polars列对象(Series)作为输入,两者类型不匹配,导致无法转换报错。
高效解法(Polars风格,无行级lambda)
利用Polars支持动态列选择的特性,直接通过表达式选取每行指定的列,再拼接值:
import polars as pl cols=['a','b','c'] values=['d','e','f'] df=(pl.DataFrame({cols[i]:[values[i]]*3 for i in range(len(cols))}) .with_columns(pl.lit(pl.Series(['a,b','b,c','a,c'])) .alias('Columns to Concatenate')) ) # 正确实现代码 result_df = df.with_columns( pl.concat_str(pl.col(pl.col('Columns to Concatenate').str.split(','))).alias('Concatenated Column String') ) print(result_df)
代码解释
pl.col('Columns to Concatenate').str.split(','):将每行的列名字符串拆分为列名列表(如第一行得到['a', 'b'])pl.col(...):将上述列名列表作为动态选择器,提取对应列的Seriespl.concat_str:将选中列的字符串值按行拼接,生成目标列
执行后输出结果:
shape: (3, 5) ┌─────┬─────┬─────┬──────────────────────┬──────────────────────────┐ │ a ┆ b ┆ c ┆ Columns to Concatenate ┆ Concatenated Column String │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ str ┆ str │ ╞═════╪═════╪═════╪══════════════════════╪══════════════════════════╡ │ d ┆ e ┆ f ┆ a,b ┆ de │ │ d ┆ e ┆ f ┆ b,c ┆ ef │ │ d ┆ e ┆ f ┆ a,c ┆ df │ └─────┴─────┴─────┴──────────────────────┴──────────────────────────┘
备选方案(基于struct打包)
如果需要更灵活的字段提取,也可以先将所有列打包为struct,再按列名列表取值拼接:
result_df = df.with_columns( pl.concat_str( pl.struct(pl.exclude('Columns to Concatenate')).row(pl.col('Columns to Concatenate').str.split(',')) ).alias('Concatenated Column String') )
这种方法通过pl.struct打包目标列,再用row()方法按列名列表提取对应字段值,最后完成拼接。
内容的提问来源于stack exchange,提问作者sjs
相关产品推荐
相关产品推荐

