表格数据用代码处理,Polars 官方文档怎么入门?

筛选几列、再按某个字段做聚合,这类表处理想直接用代码写出来。可以按官方文档把 DataFrame 这条入门路径走一遍。这不是把日志收进某套本地查询栈再交给模型,也不做和别的表处理库的全面对比。

Polars 官网 把自己写成一套数据处理框架,开源部分定位为单机上的计算引擎,面向 Python 和 SQL,采用 MIT 许可证。页里还写到,同一套引擎可以直接写 DataFrame,也可以写 SQL,查询会在同一引擎上执行。官网另外提到把同一份查询扩展到集群或托管环境的产品,那是另一条线。这里只跟开源文档把单机上的 DataFrame 入门跑通。

文档首页 则写成用于操作结构化数据的 DataFrame 库,核心用 Rust 编写,并提供 Python、R 和 NodeJS 的接口。它对 DataFrame 的说明是:二维数据结构,行和列带标签,各列可以是不同数据类型,方便做合并和聚合。设计目标包括用上机器上的全部核心、通过查询优化减少不必要的工作和内存分配、处理比内存更大的数据集,以及在运行查询前就明确数据类型的严格 schema。页里还列了几项能力:对本地、云存储和数据库等常见存储层的读写,用查询优化器决定执行方式,用流式接口在不必把全部数据同时载入内存的情况下处理结果,以及在无需额外配置的情况下把工作分到各 CPU 核心。可选地,也可以把查询放到 NVIDIA GPU 上跑。文档同时写明它能消费和产出 Arrow 数据,而且往往是零拷贝,但计算和缓冲区是自己的实现,并不建立在某套 PyArrow 实现之上。这些是官方列出的能力边界,入门不必一次用上。

更完整的入门在 Getting started。已经熟悉 DataFrame 的人,页里也说明可以跳过,直接去看后面的安装选项。Python 的安装命令是 pip install polars。Rust 一侧文档写的是 cargo add polars -F lazy,依赖版本号在文档里用占位符表示,这里不写死具体号码。页里先用一组姓名、出生日期、体重和身高构造一个小型 DataFrame,打印后可以看到四行四列,以及各列的类型。接着演示把它写到 CSV,再用 read_csv 读回来,Python 示例里为了把日期列解析回来,还加了 try_parse_dates=True。官方还写了它能读写常见文件格式(例如 csv、json、parquet)、云存储和数据库,更多例子指向 User Guide 的 IO 章节。

入门页把表达式和上下文当成下一步。表达式先写出要做的计算,例如用 pl.col("weight") / (pl.col("height") ** 2) 表示体重除以身高的平方。真正算出一列结果,要放进某个上下文里。文档依次演示了四种。select 选出并变换列,示例里用 pl.col("birthdate").dt.year().alias("birth_year") 取出出生年份,再用上面的表达式算出名为 bmi 的一列。也可以一次对多列做同一变换,并用 .name.suffix 给原列名加后缀。with_columns 和 select 很接近,差别是它把新列加回原表,而不是只留下选中的列。filter 按条件留下一部分行,例如保留出生年份早于 1990 的记录。多个条件可以写成分开的参数,不必先用 & 拼成一条。group_by 按表达式分组,示例按出生年代分组后用 len 计数,再配合 agg 计算平均体重、最大身高等。Python 示例里的 maintain_order=True 会让分组结果的顺序跟原表中出现的顺序一致,文档也写明这会让分组变慢,示例里加上它是为了让输出可复现。这些上下文可以链式组合。文档首页另有一段懒计算的例子:pl.scan_csv(...) 之后链式调用 filter、group_by、agg,最后用 collect() 才真正执行。入门不必一次把连接、拼接都走完。Getting started 后半段才演示按某列做 left join,以及纵向拼接成一张更长的表。先把读入、筛选、分组聚合跑通,再按需要看 joins 和 concat 那一节即可。

你准备先用 DataFrame 在内存里走一遍筛选和聚合,还是一开始就用 scan_csv 这条懒计算路径?