在数据分析工作中,我们常常需要将长表转换为宽表,Pandas 用户习惯使用 unstack 完成这类行转列操作。Polars 作为新一代 DataFrame 库,虽然没有 unstack 方法,但借助 pivot 函数同样可以轻松实现等效的透视聚合。

为什么 Polars 没有 unstack
Pandas 的 unstack 基于多级索引(MultiIndex)设计,而 Polars 采用列式存储且不支持多级索引结构。Polars 将透视能力统一收敛到 pivot 接口中,通过指定行、列以及聚合方式来达到展开效果。
基础用法对照
假设我们有如下长格式数据,希望把 category 展开为列,按 date 聚合 value:
import polars as pl
df = pl.DataFrame({
"date": ["2023-01-01", "2023-01-01", "2023-01-02"],
"category": ["A", "B", "A"],
"value": [10, 20, 30]
})
# Polars 实现类似 unstack 的透视
wide = df.pivot(
values="value",
index="date",
on="category",
aggregate_function="sum"
)
print(wide)
对应的 Pandas 代码通常写成:
import pandas as pd
pdf = pd.DataFrame({
"date": ["2023-01-01", "2023-01-01", "2023-01-02"],
"category": ["A", "B", "A"],
"value": [10, 20, 30]
})
pwide = pdf.groupby(["date", "category"]).sum().unstack()
pwide.columns = pwide.columns.droplevel(0)
print(pwide.reset_index())
多值聚合与缺失处理
当同一单元格存在多个值时,aggregate_function 支持传入字典分别聚合。若某些组合缺失,Polars 会自动填充 null,可用 fill_null 处理:
wide_filled = df.pivot(
values="value",
index="date",
on="category",
aggregate_function="sum"
).fill_null(0)
print(wide_filled)
注意事项
- pivot 的 index 参数对应 unstack 之前的行索引级别。
- on 参数对应被展开的索引级别,即生成的新列名来源。
- 聚合函数必须显式指定,因为 Polars 不会默认求和。
通过上述方式,你完全可以在 Polars 中以 pivot 替代 Pandas 的 unstack,并获得更清晰直观的API体验。
Polarspandas_unstackpivot修改时间:2026-07-28 21:39:17