
本文介绍使用 polars 列选择器(selectors)配合 `exclude()` 方法,一键筛选出所有整数类型列并排除特定列(如 `'p'` 和 `'z'`),避免手动列举,适用于百列级 dataframe。
在 Polars 中处理大规模结构化数据时,经常需要按数据类型批量操作列——例如,对所有整数列统一做归一化、统计或类型校验。但若需「选取所有整数列,同时排除若干特例列」,硬编码列名不仅易错,更难以维护。幸运的是,Polars 提供了强大且语义清晰的列选择器(column selectors)机制,配合链式表达式,可实现简洁、高效、可读性强的一行式解决方案。
核心思路是:先用 cs.integer() 构建一个匹配所有整数类型(i8/i16/i32/i64 等)列的选择器,再通过 .exclude("p", "z") 显式剔除不需要的列。整个过程完全惰性执行,无中间副本,性能优异。
以下为完整示例代码:
import polars as pl
import polars.selectors as cs
df = pl.DataFrame(
{
'p': [1, 2, 1, 3, 1, 2],
'x': list(range(6, 0, -1)),
'y': list(range(2, 8)),
'z': [3, 4, 5, 6, 7, None], # 注意:含 null,但 dtype 仍为 i64
"q": list('abcdef')
}
)
# ✅ 推荐做法:选取所有整数列,排除 'p' 和 'z'
result = df.select(cs.integer().exclude("p", "z"))
print(result)输出:
shape: (6, 2) ┌─────┬─────┐ │ x ┆ y │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 6 ┆ 2 │ │ 5 ┆ 3 │ │ 4 ┆ 4 │ │ 3 ┆ 5 │ │ 2 ┆ 6 │ │ 1 ┆ 7 │ └─────┴─────┘
✅ 关键优势说明:
- cs.integer() 自动识别所有有符号整数类型列(包括含 null 的 i64 列,如本例中的 'z'),无需关心具体位宽;
- .exclude() 支持字符串、正则或 selector 多种形式,此处传入列名元组即可精准过滤;
- 整个 select() 调用仅触发一次物理列提取,零冗余计算;
- 可无缝组合其他 selector,例如 cs.integer() & ~cs.by_name("p", "z") 或 cs.integer().exclude(cs.starts_with("temp")),扩展性极强。
⚠️ 注意事项:
- cs.integer() 不包含无符号整数(如 u32, u64),如需涵盖,请改用 cs.by_dtype(pl.INTEGER_DTYPES);
- 若目标列名不存在,.exclude() 不会报错,而是静默跳过(安全设计);
- 该方法仅作用于列名匹配,不检查运行时数据内容(例如某 f64 列全为整数值也不会被选中)。
总之,善用 polars.selectors 是写出健壮、可维护 Polars 代码的关键实践之一。面对数百列的场景,这一模式不仅能显著减少代码量,更能将业务逻辑(“我要整数列,但不要 p 和 z”)直接映射为代码,大幅提升开发效率与可读性。










