当前位置:首页>python>Python库巡礼--Polars

Python库巡礼--Polars

  • 2026-10-15 03:50:58
Python库巡礼--Polars
Python的第三方库生态非常强大,涉及数据分析,机器学习,Web开发,可视化,自然语言,图像处理,自动化办公等。通过pip等包管理工具快速安装和升级,大幅提升了开发效率,并推动了跨学科应用的普及!
今天我们看下Polars,一个用 Rust 编写的开源 DataFrame 库。它以极致性能、低内存占用和现代化设计著称,已成为 Pandas 的重要替代方案,特别适合处理中大型结构化数据。
发展历程大致如下

时间

里程碑

2020年3月

由前 Adyen 数据科学家 Ritchie Vink 创建,初衷是学习 Rust 语言 

2021–2022年

社区快速增长,GitHub 星标迅速上升,开始吸引企业用户

2023年8月

项目3周年,宣布成立商业公司支持开源发展 

2025年

被 scikit-learn、Hugging Face Datasets、DuckDB 等主流库原生支持,生产环境采用率大幅提升 

核心技术特点

1. Rust + Apache Arrow 架构

  • 核心用 Rust 从头编写,无垃圾回收开销,内存安全
  • 基于 Apache Arrow 列式内存模型,CPU 缓存友好
  • 多线程并行执行(默认使用所有 CPU 核心)

2. 双模式执行引擎

模式

特点

适用场景

Eager

立即执行,返回 DataFrame

小数据集、交互式分析

Lazy

构建查询计划,.collect() 时执行

大数据集、复杂管道、性能优化

3. 不可变设计

  • Polars DataFrame 不可变(immutable),操作返回新对象
  • Pandas DataFrame 可变(mutable),易引发意外副作用
  • 不可变性带来更好的并行安全性和查询优化空间

4. 表达式 API(Expression API)

  • 声明式语法,链式调用
  • 查询优化器自动重排操作顺序(如谓词下推、投影下推)
下面是一些代码示例

1. 基础操作(Eager 模式)

import polars as pl# 创建 DataFramedf = pl.DataFrame({    "name": ["Alice", "Bob", "Charlie"],    "age": [25, 30, 35],    "city": ["NYC", "LA", "Chicago"]})# 基本操作print(df.head(2))          # 前2行print(df.select("name"))   # 选择列print(df.filter(pl.col("age") > 28))  # 过滤# 新增列(不可变:返回新 DataFrame)df_with_income = df.with_columns(    (pl.col("age") * 1000).alias("income"))

2. Lazy 模式(大数据集推荐)

# 读取 CSV 文件(仅构建查询计划,不立即加载)lazy_df = (    pl.scan_csv("large_file.csv")    .filter(pl.col("status") == "active")    .select(["user_id", "timestamp", "value"])    .group_by("user_id")    .agg(pl.col("value").sum().alias("total_value"))    .sort("total_value", descending=True)    .limit(100))# 此时数据尚未加载!# 执行查询并触发优化result = lazy_df.collect()  # 查询优化器自动重排操作顺序

3. 高级功能:窗口函数

df = pl.DataFrame({    "group": ["A", "A", "A", "B", "B", "B"],    "value": [1, 2, 3, 4, 5, 6]})result = df.with_columns([    pl.col("value").rank().over("group").alias("rank_in_group"),    pl.col("value").mean().over("group").alias("group_mean"),    pl.col("value").cum_sum().over("group").alias("cumsum")])print(result)
熟悉sql的小伙伴们对这些操作应该不会陌生吧

推荐合集

推荐文章

最新文章

随机文章