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

Polars中循环多列条件转换时select语句报错问题

解决Polars中select混合循环表达式与普通列的报错问题

问题原因

当你在df.select()中单独传入一个生成器表达式时,Polars会自动迭代生成器并处理其中的每个表达式。但如果同时传入其他参数(比如普通列选择器)或者多个生成器,生成器会被当作单个参数而非展开为多个表达式,导致Polars无法正确解析,从而触发错误。

解决方案

将生成器表达式转换为列表,并用*操作符将列表中的每个表达式作为独立参数传入select()。也可以直接使用列表推导式代替生成器,写法更直观。


1. 同时处理avars和bvars的修正代码

import polars as pl

df = pl.DataFrame(
    {'a': [0,1,2,4],
     'b': [1,0,3,5],
     'w': [4,7,5,8],
     'x': [10, 20, 25, 30],
     'y': [15,3,16,88],
     'z': [22,17,4,32]
     }
)
avars=['w','x']
bvars=['y','z']

# 用列表推导式生成表达式,再用*展开
df.select(
    *[pl.when(pl.col('a')>0).then(pl.col(var)/pl.col('a')).otherwise(pl.col(var)) for var in avars],
    *[pl.when(pl.col('b')>0).then(pl.col(var)/pl.col('b')).otherwise(pl.col(var)) for var in bvars]
)

2. 添加普通列的修正代码

df.select(
    pl.col('a'),
    pl.col('b'),
    *[pl.when(pl.col('a')>0).then(pl.col(var)/pl.col('a')).otherwise(pl.col(var)) for var in avars]
)

说明

列表推导式会直接生成包含所有转换表达式的列表,*操作符会将列表中的每个元素拆解为select()的独立参数,这样Polars就能正确识别每个需要处理的列表达式,避免报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:23:14