
在 polars 中,直接传入列名列表(如 `df.select(['col1', 'col2'])`)是最简洁、最惯用的选择多列方式,无需引入 selectors 模块;selectors 更适用于基于类型、模式或条件的复杂列筛选场景。
Polars 的 select() 方法设计简洁而强大,支持多种语法风格来选取列,但最推荐、最 Pythonic 且最高效的方式是直接传入字符串列表:
import polars as pl
import numpy as np
df = pl.DataFrame({
"nrs": [1, 2, 3, None, 5],
"names": ["foo", "ham", "spam", "egg", None],
"random": np.random.rand(5),
"groups": ["A", "A", "B", "C", "B"],
})
mylist = ["nrs", "random"]
result = df.select(mylist) # ✅ 推荐:简洁、清晰、高性能
print(result)该写法不仅语义明确,而且底层优化充分,执行效率高。除此之外,以下几种等效写法也完全合法,可根据上下文灵活选用:
-
单参数解包形式(适合硬编码少量列):
df.select("nrs", "random") -
使用 pl.col() 构造表达式(便于后续组合计算或重命名):
df.select(pl.col("nrs"), pl.col("random")) # 多个表达式 df.select(pl.col(["nrs", "random"])) # 列表形式的 pl.col
⚠️ 注意事项:
- cs.by_name(mylist) 虽然功能正确,但属于“大材小用”——selectors 模块专为动态/规则化选择设计(如 cs.string()、cs.starts_with("col_")),引入它会增加认知负担和依赖冗余;
- 列名必须精确匹配(区分大小写),若列不存在会抛出 ColumnNotFoundError;
- select() 返回全新 DataFrame,原地不可变(符合 Polars 函数式设计理念)。
✅ 总结:对于静态列名列表的选择,坚持 df.select(['col_a', 'col_b']) 即可——它是最直观、最高效、最符合 Polars 惯例的做法。将 selectors 留给真正需要语义化筛选(如“所有浮点列”或“排除时间戳列”)的高级场景。










