Polars 上下文指南

Polars 是一个用 Rust 编写的 DataFrame 库,使用 Arrow 作为其底层数据结构。它的目标是通过并行化 DataFrame 上的查询,提供一个快速的解决方案。

上下文

Polars 表达式几乎可以在任何地方使用,但是表达式需要一个上下文,这些上下文包括:

  • 选择: df.select([..])
  • 分组集合: df.groupby(..).agg([..])
  • 横向堆叠(hstack) 或者增加列: df.with_columns([..])

语法糖

需要上下文的主要原因是:即使在即时执行中,你也在使用 Polars 的延迟执行API。例如:

df.groupby("foo").agg([pl.col("bar").sum()])

去掉语法糖后:

(df.lazy().groupby("foo").agg([pl.col("bar").sum()])).collect()

这种设计可以让 Polars 把表达式推送给查询引擎,进行一些优化和缓存操作。

select 上下文

select 上下文中,选择操作是按照列进行的。在选择向下文的表达式必须要返回 Series 并且这些 Series 需要有相同的长度或者长度为1。

out = df.select(
    [
        pl.sum("nrs"),
        pl.col("names").sort(),
        pl.col("names").first().alias("first name"),
        (pl.mean("nrs") * 10).alias("10xnrs"),
    ]
)
print(out)

Groupby 上下文

groupby 上下文中的表达式主要作用域分组上,因此他们会返回任意长度(每个组可能有不同数量的成员)。

out = df.groupby("groups").agg(
    [
        pl.sum("nrs"),  # 通过groups列对nrs求和
        pl.col("random").count().alias("count"),  # 记录组数
        # 如果name != null记录random列的和
        pl.col("random").filter(pl.col("names").is_not_null()).sum().suffix("_sum"),
        pl.col("names").reverse().alias(("reversed names")),
    ]
)
print(out)

更多详细信息和高级用法,请访问Polars 官方文档