Hacker News 中文摘要

RSS订阅

Python Polars 速查表(基于我们的 O'Reilly 书籍) -- Python Polars Cheatsheet (based on our O'Reilly book)

文章摘要

Polars是一个用于数据转换、分析和可视化的Python库,提供快速且表达力强的DataFrame API。用户可通过终端安装,导入后使用链式方法进行数据读取、过滤和输出。

文章总结

好的,这是根据您的要求,对原文进行的中文重述,保留了核心细节,并删减了与主题无关的内容(如书籍宣传、云服务等)。


Python Polars 速查表核心内容

Polars 是一个用于数据转换、分析和可视化的库,以其快速且富有表现力的 DataFrame API 著称。它由 Ritchie Vink 于 2020 年首次发布。

安装与导入

  • 在终端使用 uv pip install "polars[all]" 安装 Polars 及其所有可选依赖。
  • 在 Python 中导入:import polars as pl,可使用 pl.show_versions() 查看版本信息。

核心数据结构

  • Series:一维数组,存储相同数据类型的值序列。
  • DataFrame:二维表格,由多个等长的 Series 组成。
  • LazyFrame:DataFrame 的蓝图,不存储数据,用于构建优化的查询计划。

与 pandas 不同,Polars DataFrame 没有行索引,API 更倾向于不可变性和方法链。

Eager(即时)与 Lazy(惰性)API

  • Eager API:立即执行操作。
  • Lazy API:先构建一个优化的查询计划,再执行。优化器会自动进行谓词下推(尽早过滤)和投影下推(丢弃未使用的列)。
  • 通过 .lazy() 将 DataFrame 转为 LazyFrame,通过 .collect() 执行 LazyFrame 并返回 DataFrame。
  • 使用 lf.collect(engine="streaming") 启用流式引擎,可处理超出内存大小的数据集。
  • 使用 lf.explain()lf.show_graph() 查看优化后的查询计划。
  • 使用 lf.profile() 获取每个节点的执行时间。

数据类型

Polars 实现了 Apache Arrow 内存规范,支持多种数据类型,包括:

  • 数值型Decimal, Float32, Float64, Int8Int128, UInt8UInt64
  • 时间型Date, Datetime, Duration, Time
  • 嵌套型Array(定长序列), List(变长序列), Struct(多个命名字段)。
  • 字符串型String, Categorical, Enum
  • 其他Boolean, Binary, Null

数据读写

Polars 提供四类 I/O 函数:

  • read_*():将数据读入 DataFrame。
  • scan_*():创建 LazyFrame,延迟读取。
  • write_*():将 DataFrame 写入磁盘或云存储。
  • sink_*():流式写入数据,无需全部加载到内存。

支持的格式包括 CSV、Parquet、JSON、IPC/Feather、Delta Lake、Excel 等。可通过 storage_options 参数访问云存储中的文件。

数据转换

  • 选择列:通过列名 (df.select("a", "b"))、表达式 (df.select(pl.col("x") * 2))、正则表达式 (pl.col("^.*_color$")) 或选择器 (cs.numeric()) 选择列。使用 df.drop() 删除列。
  • 创建列:使用 df.with_columns() 添加新列或替换现有列。使用 pl.lit() 添加常量列,使用 df.with_row_index() 添加行号列。
  • 过滤行:使用 df.filter() 根据布尔表达式过滤。支持逻辑与 (&)、或 (|)、非 (~)。使用 df.drop_nulls() 删除缺失值,df.unique() 删除重复行。
  • 切片与采样df.head(), df.tail(), df.slice(), df.sample() 等。
  • 排序df.sort() 支持单列或多列排序,可指定升序/降序和空值位置。df.top_k()df.bottom_k() 用于获取最大/最小的 k 行。
  • 重塑df.unpivot() 实现宽表转长表,df.pivot() 实现长表转宽表。df.explode() 展开列表列,df.unnest() 展开结构体列,df.transpose() 转置。
  • 分组与聚合df.group_by() 分组后,使用 .agg() 进行聚合。支持窗口函数 over()df.group_by_dynamic()df.rolling() 用于时间序列的滚动和动态窗口计算。
  • 连接与合并df.join() 支持内连接、左连接、全外连接、半连接、反连接和交叉连接。df.join_asof() 用于非精确匹配的时间序列对齐。pl.concat() 用于纵向或横向拼接 DataFrame。

表达式

表达式是描述如何构建一个或多个 Series 的操作树。所有表达式从列 (pl.col())、所有列 (pl.all()) 或字面量 (pl.lit()) 开始。

  • 算术与比较:支持标准的算术运算符(+, -, *, / 等)和比较运算符(<, >, == 等),以及对应的 .add(), .sub(), .gt(), .eq() 等方法。
  • 布尔逻辑:使用 &, |, ~ 运算符或 .and_(), .or_(), .not_() 方法。
  • 条件表达式:使用 pl.when().then().otherwise() 链式构建。
  • 数学与统计:提供丰富的函数,如 abs(), sqrt(), log(), round(), clip(), cum_sum(), rolling_mean(), rank(), diff(), shift() 等。
  • 缺失值处理fill_null(), fill_nan(), drop_nulls(), is_null() 等。
  • 字符串操作:通过 .str 命名空间访问,如 str.contains(), str.split(), str.to_uppercase(), str.to_datetime()
  • 日期时间操作:通过 .dt 命名空间访问,如 dt.month(), dt.replace(), dt.strftime(), dt.total_seconds()
  • 列表与数组操作:通过 .list.arr 命名空间访问,如 list.len(), list.get(), arr.max(), arr.sort()
  • 结构体操作:通过 .struct 命名空间访问,如 struct.field(), struct.rename_fields()
  • 输出名称控制:通过 .name 命名空间,如 name.prefix(), name.to_lowercase()

可视化

Polars 内置的绘图方法(基于 Altair)可通过 df.plot 命名空间使用。此外,Polars DataFrame 可直接与 Plotnine、Plotly、Seaborn 等库配合使用。

评论总结

根据评论内容,总结如下:

核心观点:Polars速查表获好评,但用户对工具选择存在分歧

  1. 速查表价值认可(作者jeroenjanssens)

    • 将500页书籍压缩为2页速查表,虽"有损压缩"但实用
    • 提供PDF和HTML版本,邀请用户反馈
    • 关键引用:"It's a highly lossy compression, but hopefully a useful one!"
  2. R语言用户对Polars持观望态度(作者clircle, wsowens)

    • 认为R的data.table/dplyr+ggplot体验更优
    • 但承认Polars可能解决Pandas的痛点
    • 关键引用:"I always felt that R's data.table had the slickest dataframe developer experience"(clircle)
    • "Based on this cheatsheet though, it seems like Polars addresses some of the friction of Pandas"(wsowens)
  3. 部分用户转向DuckDB(作者mrtimo)

    • 明确表示已从Python/Polars/Pandas迁移至DuckDB
    • 关键引用:"I've moved from python/polars/pandas to DuckDB and have not looked back"

平衡性说明:评论呈现三种立场——Polars支持者(速查表制作者)、R语言偏好者(观望但开放)、DuckDB迁移者(完全转向)。未出现对Polars的强烈负面评价,但存在工具选择上的明显分歧。