You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars中实现类似Pandas的按列值Unstack数据框操作?

Polars 实现分组求和后转置(Unstack)方案

直接给出对应Polars实现代码:

import polars as pl

df = pl.DataFrame({
    "left": ["One", "One", "One", "One", "Two"],
    "center": ["P", "P", "I", "I", "I"],
    "right": [100, 100, 100, 100, 100]
})

result = (
    df
    .group_by(["left", "center"], maintain_order=True)
    .agg(pl.col("right").sum())
    .pivot(
        index="left",
        columns="center",
        values="right",
        aggregate_function=None,
        fill_value=0
    )
)

print(result)

代码对应逻辑说明

  • 分组求和:和你熟悉的Pandas groupby(["left", "center"])["right"].sum()逻辑一致,Polars通过group_by(["left", "center"]).agg(pl.col("right").sum())完成分组聚合求和。加上maintain_order=True是为了保留left列的原始顺序,和示例预期输出匹配。
  • Unstack转置:Pandas中的unstack(fill_value=0)对应Polars的pivot方法:
    • index="left":指定作为行标识的列(对应unstack后保留的索引列)
    • columns="center":指定要转为列的字段(对应unstack的层级)
    • values="right":指定填充到新列中的数值
    • aggregate_function=None:因为分组后已经是唯一的left+center组合,无需再次聚合
    • fill_value=0:填补不存在的组合值,作用和Pandas的fill_value完全相同

简化写法

如果不需要严格保留原始顺序,还可以去掉maintain_order=True,代码更简洁:

result = df.group_by(["left", "center"]).sum().pivot(index="left", columns="center", values="right", fill_value=0)

运行后会得到和预期完全一致的输出:

shape: (2, 3)
┌──────┬─────┬─────┐
│ left ┆ P   ┆ I   │
│ ---  ┆ --- ┆ --- │
│ str  ┆ i64 ┆ i64 │
╞══════╪═════╪═════╡
│ One  ┆ 200 ┆ 200 │
│ Two  ┆ 0   ┆ 100 │
└──────┴─────┴─────┘

内容的提问来源于stack exchange,提问作者Zedi10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:42:34