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
相关产品推荐
相关产品推荐

