
本文介绍如何在 Polars 中使用 filter() 配合 is_in() 方法,基于一个值列表(如 [1, 3])快速筛选 DataFrame 的指定列匹配行,替代不支持的 Python 原生 in 操作,确保语法正确且性能最优。
本文介绍如何在 polars 中使用 `filter()` 配合 `is_in()` 方法,基于一个值列表(如 `[1, 3]`)快速筛选 dataframe 的指定列匹配行,替代不支持的 python 原生 `in` 操作,确保语法正确且性能最优。
在 Polars 中,不能像 Pandas 或原生 Python 那样直接使用 df["a"] in list_of_values 进行向量化判断——该写法会报错(TypeError: 'Series' object is not iterable),因为 Polars 的布尔索引必须基于表达式(Expr)而非 Python 的成员判断逻辑。
✅ 正确做法是使用 filter() 方法配合列表达式 pl.col("column_name").is_in(values):
import polars as pl
df = pl.DataFrame({"a": [1, 2, 3], "b": [4, 3, 2]})
list_of_values = [1, 3]
y = df.filter(pl.col("a").is_in(list_of_values))
print(y)
输出:
┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 4 │ │ 3 ┆ 2 │ └─────┴─────┘
? 补充说明:
-
pl.col("a")创建对列"a"的表达式引用; -
.is_in(...)是 Polars 内置的高效向量化方法,底层由 Rust 实现,支持任意可迭代对象(列表、元组、NumPy 数组、甚至另一个 Series); - 与
==单值比较不同,is_in()自动处理多值匹配,等价于 SQL 中的IN子句; - 若需反向筛选(即排除这些值),可链式调用
.not_():df.filter(~pl.col("a").is_in(list_of_values)) # 注意波浪号 ~ 表示取反
⚠️ 注意事项:
- 不要使用
df[df["a"].is_in(...)]—— 虽然部分版本可能兼容,但filter()才是 Polars 官方推荐且语义清晰的标准接口; -
is_in()对null值默认返回null(三值逻辑),若列中含空值且需明确行为,建议先用.fill_null()处理; - 性能上,
is_in()在大数据集下远优于 Python 循环或apply(),尤其当list_of_values较小时,Polars 会自动优化为哈希查找。
掌握 filter() + is_in() 组合,是 Polars 数据筛选中最常用、最高效的模式之一,适用于去重白名单过滤、ID 匹配、分类子集提取等典型场景。










