文章摘要
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,Int8到Int128,UInt8到UInt64。 - 时间型:
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速查表获好评,但用户对工具选择存在分歧
速查表价值认可(作者jeroenjanssens)
- 将500页书籍压缩为2页速查表,虽"有损压缩"但实用
- 提供PDF和HTML版本,邀请用户反馈
- 关键引用:"It's a highly lossy compression, but hopefully a useful one!"
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)
部分用户转向DuckDB(作者mrtimo)
- 明确表示已从Python/Polars/Pandas迁移至DuckDB
- 关键引用:"I've moved from python/polars/pandas to DuckDB and have not looked back"
平衡性说明:评论呈现三种立场——Polars支持者(速查表制作者)、R语言偏好者(观望但开放)、DuckDB迁移者(完全转向)。未出现对Polars的强烈负面评价,但存在工具选择上的明显分歧。