
在 Polars 中,当 select() 内所有表达式均为聚合函数(如 .mean()、.sum()、.first() 等)时,框架会自动触发全局聚合,返回仅含单行的结果 DataFrame,无需借助 dummy 列或 group_by()。
在 polars 中,当 `select()` 内所有表达式均为聚合函数(如 `.mean()`、`.sum()`、`.first()` 等)时,框架会自动触发全局聚合,返回仅含单行的结果 dataframe,无需借助 dummy 列或 `group_by()`。
Polars 的设计哲学强调“上下文即语义”:select() 本身不隐含分组逻辑,但一旦其中所有列表达式均为聚合表达式(即返回标量值的表达式),Polars 便会智能推断用户意图是执行全表聚合(global aggregation),并自动将结果压缩为单行 DataFrame。
这与 Pandas 的 df.agg({...}) 行为类似,但更简洁、类型安全且零开销——无需构造虚拟分组键,也无需 group_by().agg() 的中间步骤。
✅ 正确用法(推荐):
import polars as pl
df = pl.DataFrame({
"a": [1, 2, 3, 4, 5],
"b": [0, 0, 1, 1, 1],
})
result = df.select(
pl.col("a").mean().alias("a_mean"),
pl.col("b").sum().alias("b_sum"),
pl.col("a").min().alias("a_min"),
pl.col("b").n_unique().alias("b_nunique")
)
print(result)输出:
shape: (1, 4) ┌────────┬────────┬────────┬──────────┐ │ a_mean ┆ b_sum ┆ a_min ┆ b_nunique│ │ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ i64 ┆ i64 ┆ u32 │ ╞════════╪════════╪════════╪══════════╡ │ 3.0 ┆ 3 ┆ 1 ┆ 2 │ └────────┴────────┴────────┴──────────┘
⚠️ 注意事项:
- 若 select() 中混入非聚合表达式(如 pl.col("a") 或 pl.col("a") + 1),Polars 将报错:InvalidOperationError: The column 'a' has more than one value, but aggregations are only allowed on columns with a single value. —— 这是类型安全的保护机制,确保语义明确。
- 所有聚合表达式必须兼容输入数据类型(例如对字符串列调用 .mean() 会抛出类型错误)。
- 如需同时保留原始行级字段与聚合结果,应使用 with_columns() + 聚合表达式(此时聚合结果会被广播至每行),而非 select()。
? 总结:df.select(...) 是 Polars 中实现无分组全局聚合的首选方式。它语义清晰、性能最优、代码最简,完全替代了“添加 dummy 列 → group_by() → agg()”的冗余模式。掌握这一模式,是写出地道、高效 Polars 代码的关键一步。










