0

0

使用 Polars 实现稀疏数据的行转列(Pivot)操作

心靈之曲

心靈之曲

发布时间:2026-01-06 19:05:02

|

197人浏览过

|

来源于php中文网

原创

使用 Polars 实现稀疏数据的行转列(Pivot)操作

本文介绍如何使用 polars 的 `pivot` 方法,将长格式稀疏数据(id-key-value 三元组)高效转换为宽格式列向量表示,适用于大规模稀疏特征工程场景。

在处理稀疏特征数据(如用户行为、基因表达、推荐系统 item-tag 关系等)时,原始存储常采用紧凑的三列结构(id, key, value),以节省空间并便于增量更新;但在建模或矩阵运算阶段,往往需要将其展开为宽表形式——即每个唯一 key 成为一列,id 作为行索引,对应 value 填入单元格,缺失值自动填充为 null。Polars 提供了原生、高性能的 pivot 操作来完成这一转换,远优于手动分组拼接或循环构造。

✅ 正确用法:df.pivot(columns, index)

只需一行代码即可完成转换:

import polars as pl

df = pl.from_repr("""
┌─────┬─────┬───────┐
│ id  ┆ key ┆ value │
│ --- ┆ --- ┆ ---   │
│ str ┆ str ┆ i64   │
╞═════╪═════╪═══════╡
│ a   ┆ m1  ┆ 1     │
│ a   ┆ m2  ┆ 2     │
│ a   ┆ m3  ┆ 1     │
│ b   ┆ m2  ┆ 4     │
│ c   ┆ m1  ┆ 2     │
│ c   ┆ m3  ┆ 6     │
│ d   ┆ m4  ┆ 4     │
│ e   ┆ m2  ┆ 1     │
└─────┴─────┴───────┘
""")

result = df.pivot(on="key", index="id", values="value")
print(result)

输出为标准宽表(5 行 × 5 列),自动对齐所有 key(m1–m4)作为列名,并保留原始数据类型(i64),缺失位置统一为 null:

Lovart
Lovart

全球首个AI设计智能体

下载
shape: (5, 5)
┌─────┬──────┬──────┬──────┬──────┐
│ id  ┆ m1   ┆ m2   ┆ m3   ┆ m4   │
│ --- ┆ ---  ┆ ---  ┆ ---  ┆ ---  │
│ str ┆ i64  ┆ i64  ┆ i64  ┆ i64  │
╞═════╪══════╪══════╪══════╪══════╡
│ a   ┆ 1    ┆ 2    ┆ 1    ┆ null │
│ b   ┆ null ┆ 4    ┆ null ┆ null │
│ c   ┆ 2    ┆ null ┆ 6    ┆ null │
│ d   ┆ null ┆ null ┆ null ┆ 4    │
│ e   ┆ null ┆ 1    ┆ null ┆ null │
└─────┴──────┴──────┴──────┴──────┘
? 参数说明: on="key":指定要“展开”的列(即新列名来源); index="id":指定行标识列(即新表的行索引); values="value":指定填充单元格的数值列(默认为 value,可省略)。

⚠️ 注意事项与进阶提示

  • 仅支持 eager 模式:pivot() 是 eager-only 方法,不适用于 LazyFrame。若需在 lazy 流程中 pivot,须先 .collect(),或改用 group_by().agg() + struct + unnest 组合实现(参见 Polars 官方文档 Lazy Pivot 替代方案)。
  • 自动推断列名:on 列的所有唯一值将自动作为新列名,无需预先枚举(但要求 on 列值为合法标识符;含特殊字符时建议先清洗)。
  • 聚合冲突处理:若同一 (id, key) 出现多行,默认取首值;如需自定义聚合(如 sum、mean),需显式传入 aggregate_function 参数,例如:
    df.pivot(on="key", index="id", values="value", aggregate_function=pl.col("value").sum())
  • 内存友好性:Polars 的 pivot 底层基于哈希分组和稀疏列分配,对高基数稀疏数据表现优异,显著优于 Pandas 的 pivot_table(尤其在百万级以上记录时)。

✅ 总结

将稀疏长表转为宽表是特征工程中的高频操作。Polars 的 pivot() 方法以简洁语法、明确语义和卓越性能,成为该任务的理想选择。掌握其核心参数与限制(尤其是 eager/lazy 差异),可大幅提升数据预处理 pipeline 的可读性与执行效率。对于超大规模场景,建议配合 scan_parquet() + collect() 分块 pivot,避免单次内存峰值过高。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

51

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

299

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

219

2025.10.31

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

179

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

276

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

252

2025.06.11

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号