Polars中如何对列表指定的多列批量执行乘-1运算
Polars 基于列名列表批量对多列应用相同运算的实现方案
问题场景
需要将Polars DataFrame中var_3、var_4列的值乘以-1,逐列硬编码写表达式可以正常运行,但待处理列数较多时,希望通过列名列表完成批量操作。
逐列操作的参考代码:
import polars as pl df = pl.DataFrame({ "var_1": ["a", "a", "b"], "var_2": ["c", "d", "e"], "var_3": [1, 2, 3], "var_4": [4, 5, 6] }) df.with_columns([ pl.col("var_3") * -1, pl.col("var_4") * -1 ])
运行后输出符合预期的结果:
shape: (3, 4) ┌───────┬───────┬───────┬───────┐ │ var_1 ┆ var_2 ┆ var_3 ┆ var_4 │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 ┆ i64 │ ╞═══════╪═══════╪═══════╪═══════╡ │ a ┆ c ┆ -1 ┆ -4 │ │ a ┆ d ┆ -2 ┆ -5 │ │ b ┆ e ┆ -3 ┆ -6 │ └───────┴───────┴───────┴───────┘
尝试的批量写法未生效,代码如下:
var_list = ["var_3", "var_4"] pl_cols_var_list = [pl.col(k) for k in var_list] df.with_columns(pl_cols_var_list * -1)
错误原因
pl_cols_var_list是普通Python列表,直接对Python列表执行* -1不属于Polars的表达式运算逻辑,属于Python层面的无效操作,因此不会触发预期的列值计算。
正确写法
推荐写法:直接给pl.col()传入列名列表
Polars原生支持pl.col()接收列名列表参数,传入后会自动对列表内所有列统一应用后续的运算逻辑,性能最优,代码最简洁:
var_list = ["var_3", "var_4"] result = df.with_columns(pl.col(var_list) * -1)
灵活写法:列表推导式逐列生成运算表达式
如果后续需要给不同列加差异化处理逻辑,可以在列表推导式中直接对每个列对象应用运算,再传入with_columns:
var_list = ["var_3", "var_4"] result = df.with_columns([pl.col(col_name) * -1 for col_name in var_list])
两种写法的运行结果和逐列硬编码的效果完全一致。
内容的提问来源于stack exchange,提问作者mark0512
相关产品推荐
相关产品推荐

