
本文介绍如何利用 Polars 的 any_horizontal() 和列选择语法,将多个重复的 ~col.is_in([None, 0]) 条件简洁地重构为符合 DRY 原则的单表达式过滤逻辑,提升代码可维护性与可读性。
本文介绍如何利用 polars 的 `any_horizontal()` 和列选择语法,将多个重复的 `~col.is_in([none, 0])` 条件简洁地重构为符合 dry 原则的单表达式过滤逻辑,提升代码可维护性与可读性。
在 Polars 中进行多列逻辑过滤时,若对若干列应用相同判断逻辑(例如“该列值不为 None 或 0”),直接硬编码每个列的条件不仅冗长,还违背 DRY(Don’t Repeat Yourself)原则。原始写法:
df.filter((~pl.col("val1").is_in([None, 0])) | (~pl.col("val2").is_in([None, 0])))
存在明显重复:is_in([None, 0]) 被调用两次,~(取反)也重复出现,扩展至更多列时维护成本陡增。
✅ 推荐解法是结合 列批量选择 + 水平逻辑聚合:
- 使用
pl.col("val1", "val2")一次性选取多列; - 链式调用
.is_in([None, 0]),自动广播至各列,返回结构相同的布尔表达式列表; - 使用
.not_()替代~(语义更清晰,且支持链式调用); - 最终用
pl.any_horizontal(...)对每行各列结果执行逻辑或(|),即:只要任一列满足“非 None 且非 0”,该行就保留。
完整重构代码如下:
import polars as pl
df = pl.DataFrame(
{
"a": [1, 2, 3, 4, 5],
"val1": [1, None, 0, 0, None],
"val2": [1, None, None, 0, 1],
}
)
result = df.filter(
pl.any_horizontal(
pl.col("val1", "val2").is_in([None, 0]).not_()
)
)
print(result)
✅ 输出与原始逻辑完全一致,且具备强扩展性:只需在
pl.col(...)中追加列名(如"val3", "val4"),无需新增条件分支。
? 补充说明:
- 若需改为「所有指定列都满足条件」,则替换为
pl.all_horizontal(...); -
is_in([None, 0])可安全处理null值(Polars 中None即null),结果为null时,.not_()仍保持null,而any_horizontal()默认将null视为False(可通过ignore_nulls=False调整); - 此模式适用于任意数量同质判断逻辑的列,是 Polars 函数式表达式的典型高效用法。
遵循此模式,你的过滤逻辑将更简洁、健壮、易于演进。










