
在 Polars 中,可使用 pl.lit(True) 作为恒真布尔表达式,用于 filter() 操作以保留全部行,效果等同于 SQL 的 SELECT *;但需注意其在 Series 和含 Null 列的 DataFrame 中的兼容性限制。
在 polars 中,可使用 `pl.lit(true)` 作为恒真布尔表达式,用于 `filter()` 操作以保留全部行,效果等同于 sql 的 `select *`;但需注意其在 series 和含 null 列的 dataframe 中的兼容性限制。
在 Polars 的惰性或 eager 模式下,filter() 方法要求传入一个返回布尔型 Series 的表达式(Expression),即谓词(predicate)。若希望无条件保留所有行(即“恒等过滤”),最直观、高效且语义清晰的方式是使用字面量布尔表达式:pl.lit(True)。
import polars as pl
df = pl.DataFrame({
"id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
"age": [24, 28, 23],
"active": [True, False, True]
})
# ✅ 推荐:简洁、明确、性能最优
result = df.filter(pl.lit(True))
print(result)
# 输出完整原始 DataFrame(3 行 × 4 列)
⚠️ 注意:虽然 Python 布尔字面量 True 在部分上下文中会被自动提升为 pl.lit(True),但显式使用 pl.lit(True) 是唯一可靠且文档化支持的方式,避免隐式转换带来的不确定性。
不适用场景与替代方案
1. 对 pl.Series 使用 filter() 时不可用
pl.Series.filter() 的签名与 DataFrame 不同——它只接受布尔列表(mask)或长度匹配的布尔 Series,不接受 Polars Expression:
s = pl.Series("values", [10, 20, 30])
# ❌ 报错:AttributeError: 'Expr' object has no attribute '_s'
# s.filter(pl.lit(True))
# ✅ 正确:传入全 True 的 Python list 或布尔 Series
s.filter([True, True, True]) # → Series with all values
# 或
s.filter(pl.Series([True, True, True]))
2. 含全 null 列的 DataFrame(旧版本 Polars)
在 Polars ≤1.12 中,若 DataFrame 存在类型为 Null 的列(如 pl.DataFrame({"A": [None, None]})),df.filter(pl.lit(True)) 可能因内部广播逻辑异常而抛出 ShapeError(提示 filter 长度为 1,但 series 长度为 2)。该问题已在 Polars ≥1.15 中修复,但仍建议在跨版本兼容场景中采用更鲁棒的写法:
# ✅ 兼容 DataFrame 和 Series 的通用写法(推荐用于脚本/库开发) mask = [True] * len(df) # 或 len(series) df_filtered = df.filter(mask) # 对 Series: series_filtered = series.filter(mask)
总结
- ✅ 首选方案:df.filter(pl.lit(True)) —— 语义清晰、性能优秀、适用于绝大多数 DataFrame 场景;
- ⚠️ Series 过滤:必须使用布尔列表或布尔 Series,不可用 pl.lit(True);
- ?️ 最大兼容性:若需同时支持 DataFrame 和 Series,或运行于不确定 Polars 版本的环境中,统一使用 [True] * len(obj) 构造 mask;
- ? 避免冗余逻辑表达式:如 (pl.col("x") == 0) | (pl.col("x") != 0) 不仅低效、易出错(空列/Null 值时可能失效),还丧失可读性。
恒真表达式虽小,却是构建可组合、可测试数据管道的基础构件——选择正确、稳定、可维护的实现方式,是 Polars 工程实践的重要细节。











