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

Polars中动态指定多条件创建新列的实现方法

Polars中动态指定多条件创建新列的实现方法

我太懂你这种要手动逐个写条件的烦躁了——尤其是条件数量变多的时候,重复代码不仅写着累,还容易出错!好在Polars的表达式系统足够灵活,完全可以实现像Pandas那样的动态条件判断,而且还能保留它的高性能优势,完美适配你的大数据场景。

核心思路:用列表推导式动态生成条件表达式

你之前的代码里,最繁琐的就是手动把每个conditions元素写成单独的表达式。其实我们可以用列表推导式自动生成所有需要的条件,再把它们传给pl.any_horizontal(),这样不管conditions里有1个还是10个元素,代码都不用改。

完整实现代码

直接看修改后的Polars代码,对比你原来的写法,是不是清爽多了:

import polars as pl

df = pl.DataFrame({
'Codes_1': ['302E513', '301E513', '302E512'],
'Codes_2': ['303E513', '306E510', '302E512']}).lazy()

conditions = ['302E513', '306E510', '5164E23', '302E514']
column_names = ['Codes_1', 'Codes_2']

# 动态生成所有条件表达式,不用手动逐个写!
df = df.with_columns(
   pl.when(pl.any_horizontal(
       # 关键改动:用列表推导式遍历conditions生成所有前缀匹配条件
       *[pl.col(column_names).str.starts_with(code) for code in conditions]
   ))
   .then(1.0)
   .otherwise(0.0)
   .alias('Column_name')
)

# 执行并查看结果
print(df.collect())

代码解释

  • 这里用[pl.col(column_names).str.starts_with(code) for code in conditions]遍历所有条件,自动生成每个code对应的前缀匹配表达式,形成一个表达式列表。
  • 用*把列表拆成单独的参数传给pl.any_horizontal(),和你手动写多个表达式的效果完全一样,但实现了动态适配。
  • 不管你后续把conditions改成2个、5个还是20个,这部分代码都不需要调整,直接就能用。

扩展:如果是精确匹配怎么办?

如果你要的不是前缀匹配,而是精确匹配某个值,方法也是一样的,把str.starts_with换成eq就行:

df = df.with_columns(
   pl.when(pl.any_horizontal(
       *[pl.col(column_names).eq(code) for code in conditions]
   ))
   .then(1.0)
   .otherwise(0.0)
   .alias('Exact_Match_Column')
)

这样既保留了Polars对大数据集的高效处理能力,又解决了手动写条件的繁琐问题,完美替代你之前用Pandas循环生成掩码的思路~

备注:内容来源于stack exchange,提问作者zebra_zach_12345

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:50:29