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

