Polars 中实现类似 Pandas unstack() 的透视聚合操作

本文详解如何在 polars 中通过 `.pivot()` 方法完成基于列值的宽表转换(即“unstack”),替代 pandas 的 `groupby().sum().unstack()` 模式,并处理缺失值填充等关键细节。

在数据处理中,将长格式(long format)DataFrame 转换为宽格式(wide format)是常见需求,例如按某一列(如 left)分组,再将另一列(如 center)的唯一值作为新列名,对目标数值列(如 right)进行聚合(如求和)。Pandas 中惯用 groupby().sum().unstack(fill_value=0) 实现;而在 Polars 中,对应的核心方法是 .pivot() —— 它专为这类结构化透视设计,性能更优、语义更清晰。

以下为完整实现步骤:

1. 构造示例数据

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]
})

2. 使用 .pivot() 进行透视聚合

调用 df.pivot() 时需明确三个关键参数:

  • values:待聚合的数值列(此处为 "right");
  • index:作为新表行索引的列(此处为 "left");
  • columns:用于生成新列名的列(此处为 "center");
  • aggregate_function:指定聚合逻辑,支持字符串(如 "sum")或表达式(如 pl.col("right").sum())。

✅ 推荐写法(清晰且显式):

result = df.pivot(
    values="right",
    index="left",
    columns="center",
    aggregate_function="sum"
)

⚠️ 注意:原始答案中 df.pivot('center', index='left', ...) 的参数顺序已过时(旧版 Polars API),当前稳定版(v0.20+)必须显式使用关键字参数 values, index, columns,否则会报错或行为异常。

Bardeen AI

使用AI自动执行人工任务

下载

执行后输出为:

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

3. 处理缺失值:fill_null(0)

与 Pandas 的 fill_value=0 类似,Polars 中需链式调用 .fill_null(0):

result = (
    df.pivot(
        values="right",
        index="left",
        columns="center",
        aggregate_function="sum"
    )
    .fill_null(0)
)

最终结果完全匹配预期:

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

✅ 关键注意事项

  • 参数命名强制化:新版 Polars 不再支持位置传参,values/index/columns 必须以关键字形式传入;
  • 聚合函数灵活性:除 "sum" 外,还支持 "mean"、"count"、"first" 等字符串简写,或自定义表达式(如 pl.col("right").max().over("left"));
  • 多值透视:若需同时透视多个数值列,可传入列表:values=["right", "other_col"];
  • 性能优势:.pivot() 是 Polars 原生优化操作,相比手动 group_by().agg() + join() 组合,内存效率与执行速度更佳。

掌握 .pivot() 是构建高效 Polars 数据流水线的重要一环——它不仅是语法替代,更是向声明式、向量化思维的自然演进。

相关推荐:

Excel数据透视表怎么刷新 实时同步源数据变动的方法

Excel数据透视表不会自动响应源数据变动,必须手动刷新:右键单击透视表内任意单元格选择“刷新”可快速验证单表;批量刷新用“数据”选项卡中“全部刷新”或快捷键Alt+F5;为覆盖新增数据,需将源数据转为结构化表格(Ctrl+T)并重设数据源;外部数据源需在“查询和连接”属性中启用“打开文件时刷新数据”及“允许后台刷新”。 Excel数据透视表不会自动响应源数据变动,修改原始表格后透视表仍显示旧值,...

ai聚合平台软件下载

国内主流AI聚合平台包括:百度AI开放平台(全栈AI能力)、阿里云PAI(企业级机器学习)、腾讯云TI(多模态处理)、科大讯飞(语音交互专家)、商汤科技(计算机视觉龙头)、华为云ModelArts(低代码开发)和京东云NeuHub(自动化工具),详情可访问各平台官网。 >>ai绘画生成软件app免费下载 >>ai创作音乐免费入口 ai聚合平台有哪些软件? ‌1. 综合型AI...

ai聚合平台推荐

国内AI聚合平台主要包括百度AI开放平台(提供OCR、语音合成等能力,适合开发者)、阿里云AI(整合语音、视觉技术,侧重电商金融)、腾讯云AI(擅长多媒体生成和社交应用)、华为云AI(强调端边云协同和工业场景)等,这些平台覆盖从基础技术到垂直行业的多样化AI服务。 >>ai生成视频入口 >>ai生成图片在线制作 ai聚合平台有哪些? 1、百度AI开放平台‌ 官方入口:点此进...

即梦AI怎么做那种鱼眼镜头的夸张透视效果?

要实现即梦AI中强烈的鱼眼镜头效果,需采用五种方法:一、用“180度鱼眼”等预设提示词锚定畸变;二、通过动效画板手动绘制径向畸变路径;三、混合真实鱼眼视频参考以强制光学一致性;四、用首尾帧差值诱导连续畸变转场;五、启用即梦Agent进行多帧协同畸变建模。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您在即梦AI中尝试生成具有强烈视觉张...
· AI · 34821

3699小游戏排行榜精选_全网热门游戏聚合入口

3699小游戏排行榜精选入口为https://www.3699.cc,涵盖2800+款H5/Flash游戏,支持IP检索、四大榜单、轻量化运行、友好交互及稳定更新机制。 3699小游戏排行榜精选\_全网热门游戏聚合入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来3699小游戏排行榜精选\_全网热门游戏聚合入口地址,感兴趣的网友一起随小编来瞧瞧吧! https://www.3699.c...

怎样修改数据透视表数据源_更改引用范围步骤【数据更新】

需手动更新数据源区域,否则透视表无法反映最新数据;具体包括:一、通过“分析”选项卡重新框选范围;二、绑定为动态Excel表格;三、切换至外部数据源或新工作表。 如果您已创建数据透视表,但原始数据范围发生变动(如新增行、列或数据位置迁移),则需手动更新其引用的数据源区域,否则透视表将无法反映最新数据。以下是修改数据透视表数据源及调整引用范围的具体步骤: 一、通过“分析”选项卡更改数据源区域 该方法适...

如何在Python中为测试用例添加自定义标记_通过pytest.mark进行分类执行

pytest.mark 必须作为装饰器直接作用于测试函数或类,不可写在函数外部;可叠加多个标记,执行时用 -m "mark1 and mark2" 等布尔表达式筛选;未注册标记会触发警告,需在 pytest.ini 或 pyproject.toml 中声明以避免。 pytest.mark 能不能直接用在函数外面 不能。所有 pytest.mark 必须装饰在测试函数或类上,写在函数定义之外会报 S...
· Python · 231009

如何在Python中构建树状结构的递归生成器_使用yield from简化递归代码

yield from 在树遍历中省去了手动展开子生成器的繁琐与风险,自动处理委托调用、异常传播、StopIteration 捕获及协程方法转发,确保扁平化输出和行为一致性。 yield from 在树遍历中到底省了什么 直接说结论:yield from 不是语法糖,它把递归生成器的“委托调用”从手动循环 + yield 拆解成一条语句,避免了中间迭代器被提前耗尽、异常传播断裂、或 StopIter...
· Python · 148370