
关于
快速内存 DataFrame 库,适用于内存可容纳的数据集。当 pandas 太慢但数据仍可放入内存时使用。支持惰性求值、并行执行和 Apache Arrow 后端。最适合 1-100GB 数据集、ETL 管道和替代 pandas 的高性能场景。超大数据集请使用 dask 或 vaex。
name: polars description: 快速内存 DataFrame 库,适用于可放入 RAM 的数据集。当 pandas 太慢但数据仍可放入内存时使用。惰性求值、并行执行、Apache Arrow 后端。最适合 1-100GB 数据集、ETL 管道、更快的 pandas 替代品。对于超出 RAM 的数据使用 dask 或 vaex。 license: https://github.com/pola-rs/polars/blob/main/LICENSE metadata: skill-author: K-Dense Inc. risk: unknown source: community
Polars
何时使用
- 需要比 pandas 更快的内存 DataFrame 工作流,且数据仍可放入 RAM 时。
- 构建受益于惰性求值和并行执行的 ETL、分析或转换管道时。
- 需要基于 Apache Arrow 语义的表达式驱动表格操作时。
概述
Polars 是基于 Apache Arrow 构建的超快 Python 和 Rust DataFrame 库。使用 Polars 基于表达式的 API、惰性求值框架和高性能数据操作能力,实现高效数据处理、pandas 迁移和数据管道优化。
快速开始
安装和基本用法
安装 Polars:
uv pip install polars
基本 DataFrame 创建和操作:
import polars as pl
# Create DataFrame
df = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35],
"city": ["NY", "LA", "SF"]
})
# Select columns
df.select("name", "age")
# Filter rows
df.filter(pl.col("age") > 25)
# Add computed columns
df.with_columns(
age_plus_10=pl.col("age") + 10
)
核心概念
表达式
表达式是 Polars 操作的基本构建块。它们描述数据上的转换,可以组合、复用和优化。
关键原则:
- 使用
pl.col("column_name")引用列 - 链式调用方法构建复杂转换
- 表达式是惰性的,仅在上下文中执行(select、with_columns、filter、group_by)
示例:
# Expression-based computation
df.select(
pl.col("name"),
(pl.col("age") * 12).alias("age_in_months")
)
惰性 vs 即时求值
即时(DataFrame): 操作立即执行
df = pl.read_csv("file.csv") # Reads immediately
result = df.filter(pl.col("age") > 25) # Executes immediately
惰性(LazyFrame): 操作构建查询计划,执行前优化
lf = pl.scan_csv("file.csv") # Doesn't read yet
result = lf.filter(pl.col("age") > 25).select("name", "age")
df = result.collect() # Now executes optimized query
何时使用惰性:
- 处理大型数据集时
- 复杂查询管道
- 只需要部分列/行时
- 性能至关重要时
惰性求值的好处:
- 自动查询优化
- 谓词下推
- 投影下推
- 并行执行
详细概念请加载 references/core_concepts.md。
常用操作
Select
选择和操作列:
# Select specific columns
df.select("name", "age")
# Select with expressions
df.select(
pl.col("name"),
(pl.col("age") * 2).alias("double_age")
)
# Select all columns matching a pattern
df.select(pl.col("^.*_id$"))
Filter
按条件过滤行:
# Single condition
df.filter(pl.col("age") > 25)
# Multiple conditions (cleaner than using &)
df.filter(
pl.col("age") > 25,
pl.col("city") == "NY"
)
# Complex conditions
df.filter(
(pl.col("age") > 25) | (pl.col("city") == "LA")
)
With Columns
添加或修改列同时保留现有列:
# Add new columns
df.with_columns(
age_plus_10=pl.col("age") + 10,
name_upper=pl.col("name").str.to_uppercase()
)
# Parallel computation (all columns computed in parallel)
df.with_columns(
pl.col("value") * 10,
pl.col("value") * 100,
)
Group By 和聚合
分组数据并计算聚合:
# Basic grouping
df.group_by("city").agg(
pl.col("age").mean().alias("avg_age"),
pl.len().alias("count")
)
# Multiple group keys
df.group_by("city", "department").agg(
pl.col("salary").sum()
)
# Conditional aggregations
df.group_by("city").agg(
(pl.col("age") > 30).sum().alias("over_30")
)
详细操作模式请加载 references/operations.md。
聚合和窗口函数
聚合函数
group_by 上下文中的常用聚合:
pl.len()- 计数行pl.col("x").sum()- 求和pl.col("x").mean()- 平均值pl.col("x").min()/pl.col("x").max()- 极值pl.first()/pl.last()- 首/末值
使用 over() 的窗口函数
应用聚合同时保留行数:
# Add group statistics to each row
df.with_columns(
avg_age_by_city=pl.col("age").mean().over("city"),
rank_in_city=pl.col("salary").rank().over("city")
)
# Multiple grouping columns
df.with_columns(
group_avg=pl.col("value").mean().over("category", "region")
)
兼容工具
Claude CodeCursor
标签
数据工程
