Skip to main content

数据分析工具之-Polars

· 3 min read

在此前的官网和 APP 数据分析工作中,一直使用 Pandas 这个老牌的工具。但遇到一些问题,比如针对大数据集预处理时速度慢,内存占用大。速度慢可以通过多线程处理去解决,但这样就需要分块处理,或使用 dask 等中间层,内存占用在 Pandas 的前提下,暂时无解。

由于存在上述问题,准备在业务数据分析时引入 Polars,更好利用起来目前有限的 CPU 和内存资源。

Polars 简介

Polars is a blazingly fast DataFrame library for manipulating structured data. The core is written in Rust, and available for Python, R and NodeJS.

官网: https://docs.pola.rs/

Polars 的特性有:

  • 快,非常快,可以实际验证相同数据集相同操作下二者的处理速度差异。
  • 对许多不同数据源都提供完善支持:包括但不限本地数据、云存储、数据库。
  • 用户友好的 API
  • 流式 API 按需加载,内存利用率高
  • 并行处理,无需任何额外配置
  • 矢量查询引擎

它提供了针对 Python, R, Rust 等语言的 API.

且 Polars 的 DataFrame 概念和 Pandas 互通, 有提供 API 可以将 Pandas DataFrame 和 Polars DataFrame 间进行转换。

Polars Expression

https://docs.pola.rs/user-guide/getting-started

Expressions 是 Polars 的核心概念. 它提供一种模块化的结构来将简单查询组合成复杂查询.

如下是四个基础表达式构造块:

  • select: 用于选择 DF 中的列, 比如 df.select(pl.col("*"))df.select(pl.col("a", "b"))

  • filter: 用于过滤 DF 来创建一个它的子集, 比如

    df.filter(
    pl.col("c").is_between(datetime(2025, 12, 2), datetime(2025, 12, 3)),
    )

    或者是更为复杂的过滤:

    df.filter((pl.col("a") <= 3) & (pl.col("d").is_not_nan()))
  • with_columns: 用于创建新的 Column

    df.with_columns(pl.col("b").sum().alias("e"), (pl.col("b") + 42).alias("b+42"))
  • group_by: 用于根据指定条件对 DF 进行分组.

    df2.group_by("y", maintain_order=True).len()

合并多个 DataFrame

合并时有两种:

  • 横向: join
  • 纵向: concate

其他相关内容详见官方文档.