在Polars中能否基于同一组条件批量创建多列?
在Polars中能否基于同一组条件批量创建多列?
当然可以啦!完全不用给每一列单独写when.then.otherwise,用Polars的struct配合条件判断就能一次性生成多列,既简洁又能避免重复写条件的麻烦~
就拿你给出的Python逻辑来说,我们可以把满足条件和不满足条件时的多列值分别打包成struct,然后通过一次条件判断生成这个struct列,最后把它拆成单独的列就行。具体代码示例如下:
import polars as pl # 先创建一个示例DataFrame df = pl.DataFrame({ "x": [1, 2, 1], "y": [3, 3, 2], "w": [300*50, 300*200, 300*80], "z": [50, 200, 80] }) # 批量生成多列的核心代码 result_df = df.with_columns( pl.when( (pl.col("x") == 1) & (pl.col("y") == 3) & (pl.col("w") == 300 * pl.col("z")) & (pl.col("z") < 100) ).then( # 满足条件时的多列值打包成struct pl.struct( tot=pl.lit(300), work=pl.lit(400), sie=pl.lit(500), walk=pl.lit("into") ) ).otherwise( # 不满足条件时的多列值打包成struct,这里可以引用其他列计算 pl.struct( tot=pl.lit(350), work=400 * pl.col("tot"), sie=pl.col("tot") / 1000, walk=pl.lit("outof") ) ).alias("temp_struct") ).unnest("temp_struct") # 把struct列拆成单独的列 print(result_df)
这里还有几个小细节要注意:
- 条件里的每一个判断都要用括号括起来,避免逻辑运算优先级的问题
- 用
pl.lit()来包装常量值,确保Polars能正确识别数据类型 - 最后用
.unnest()把struct列展开成独立的列,就能得到你需要的四个新变量
这种方法的好处是只需要写一次条件,不用重复写四次when.then.otherwise,不仅代码更整洁,还能减少出错的概率哦~
备注:内容来源于stack exchange,提问作者catquas
相关产品推荐
相关产品推荐

