返回

文章详情

Python Polars 速查表(基于我们的 O'Reilly 书籍)

Hacker News2026年8月18日 13:38

Polars 是一个用于转换、分析和可视化数据的库,具有快速且表达丰富的 DataFrame API。它于 2020 年由 Ritchie Vink 首次发布。通过终端安装带有所有可选依赖项的 Polars:uv pip install "polars[all]" 在 Python 中导入 Polars,并确认安装了哪些版本的 Polars 及其依赖项:import polars as pl pl.show_versions() Polars 查询通常读取数据、转换数据,并将结果写回。完整的查询通常是一个方法调用的单一链条:fruit = pl.read_csv("fruit.csv") fruit.filter((pl.col("weight") > 1000) & pl.col("is_round")).write_parquet("fruit.parquet") 在整个速查表中,df 是一个 DataFrame,lf 是一个 LazyFrame,o 是一个与 df 组合的第二个 DataFrame,e 代表任何表达式。因此,e.abs() 意味着“在表达式上调用 .abs()”,如 pl.col("x").abs()。数据结构 # Polars 将其所有数据存储在 Series 或 DataFrame 中。结构描述 Series 一维。包含相同数据类型的值序列。DataFrame 二维。具有行和列。一个或多个 Series,所有长度相同。LazyFrame 类似于 DataFrame,但不保存任何数据。生成 DataFrame 的蓝图。与 pandas 不同,Polars DataFrame 没有行索引,API 优先考虑不可变性和方法链式调用,而不是就地修改。通过传递名称和值序列来创建 Series:series = pl.Series("sales", [150.00, 300.00, 250.00]) 从列字典中创建 DataFrame,其中每个值是 Series 或普通 Python 序列。您还可以使用任何 pl.read_*() 函数从文件创建一个:df = pl.DataFrame({"sales": series, "id": [41, 42, 43]}) 由于没有行索引,当需要时,请显式添加它作为一列:df.with_row_index("id") 将 DataFrame 转换为 LazyFrame。或者,可以直接从任何 pl.scan_*() 函数开始 LazyFrame:lf = df.lazy() 急切和懒惰的 API # 急切 API 立即执行,而懒惰 API 首先构建一个优化的查询计划。优化器自动应用谓词下推(尽早过滤)和投影下推(丢弃从不使用的列)。通过 .lazy() 和 .collect() 在这两个表示之间移动:.lazy() 将 DataFrame 转换为 LazyFrame,.collect() 执行 LazyFrame 并返回 DataFrame。将 DataFrame 转换为 LazyFrame,并执行 LazyFrame 以获取 DataFrame:lf = df.lazy() df = lf.collect() 使用流处理引擎处理外部的非内存数据,以便可以处理比内存更大的数据集:lf.collect(engine="streaming") 将优化的查询计划以文本形式打印,或将其可视化为图形,以查看优化器决定执行的内容:lf.explain() lf.show_graph() 执行查询并返回每个节点的时间,这告诉您时间实际上流向何处:lf.profile() 数据类型 # Polars 实现了大部分 Apache Arrow 内存规范,这是平面和层次数据的高效列格式。分组 类型 注释 数值 Decimal 128 位,精度,比例 Float32 范围 ±3.4×10³⁸ Float64 范围 ±1.8×10³⁰⁸ Int8 范围 ±128 Int16 范围 ±32,768 Int32 范围 ±2.1×10⁹ Int64 范围 ±9.2×10¹⁸ Int128 范围 ±3.4×10³⁸ UInt8 范围 0–255 UInt16 范围 0–65,535 UInt32 范围 0–4.3×10⁹ UInt64 范围 0–1.8×10¹⁹ 时间 Date 自 Unix 纪元以来的天数 Datetime 自纪元以来的微秒 Duration 时间段 / delta Time 一天中的时间 嵌套 数组 固定长度序列 列表 可变长度序列 结构 具有名称的多个字段 字符串 UTF-8 文本,变长 分类 字符串字典 枚举 固定字符串字典 其他 布尔值 真 / 假 二进制 原始字节 Null 表示 Null / None 检查类型 # 获取列名称和数据类型的字典,或仅获取数据类型列表:df.schema df.dtypes 打印每列一行,包括数据类型,对于宽 DataFrame 而言很有用,这种情况下打印整个 DataFrame 是不可读的:df.glimpse() 计算每列的汇总统计,包括空值数量:df.describe() 报告 DataFrame 在所请求单位中的内存大小:df.estimated_size("mb") 转换 # 将列转换为另一种数据类型。默认情况下,转换是严格的,因此不适合的值会引发错误:df.select(pl.col("id").cast(pl.UInt64)) 传递 strict=False 以无错误方式转换。溢出目标类型的值会变为 null:df.select(pl.col("id").cast(pl.Int8, strict=False)) 读取和写入数据 # Polars 有四类输入和输出函数,您选择哪一个取决于您是急切还是懒惰:read_*() 将数据读取到 DataFrame 中。scan_*() 创建一个 LazyFrame,推迟实际读取,直到您收集。write_*() 将 DataFrame 写入磁盘或云存储

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡