0

0

Polars数据框重塑:将列表列展开为多列的技巧

DDD

DDD

发布时间:2025-10-24 14:51:07

|

496人浏览过

|

来源于php中文网

原创

Polars数据框重塑:将列表列展开为多列的技巧

本文详细介绍了在polars中如何将包含列表的数据框列进行复杂重塑。通过结合`unpivot`、`list.to_struct`和`unnest`操作,可以将原始数据框的列名转换为新列的值,并将列表元素展开为多个独立的列,从而实现数据从宽格式到长格式再到特定宽格式的灵活转换,极大地简化了数据处理流程。

在数据分析和处理中,我们经常会遇到需要对数据框的结构进行复杂重塑的场景。特别是在处理包含列表(List)类型数据的列时,如何将这些列表元素有效地展开为独立的列,并同时重构数据框的整体布局,是Polars用户面临的常见挑战。本教程将详细演示如何利用Polars的强大功能,通过一系列链式操作,将一个包含列表列的数据框转换为一个更易于分析的宽格式数据框。

初始数据框结构

假设我们有一个Polars数据框,其中包含多个列,每个列的值都是一个列表。

import polars as pl

df = pl.DataFrame({
    "foo": [[1, 2, 3], [7, 8, 9]],
    "bar": [[4, 5, 6], [1, 0, 1]]
})

print("原始数据框:")
print(df)

输出:

原始数据框:
shape: (2, 2)
┌─────┬─────┐
│ foo ┆ bar │
│ --- ┆ --- │
│ list[i64] ┆ list[i64] │
╞═════╪═════╡
│ [1, 2, 3] ┆ [4, 5, 6] │
│ [7, 8, 9] ┆ [1, 0, 1] │
└─────┴─────┘

我们的目标是将这个数据框转换为以下结构:

shape: (4, 4)
┌──────┬────────┬────────┬────────┐
│ Name ┆ Value0 ┆ Value1 ┆ Value2 │
│ ---  ┆ ---    ┆ ---    ┆ ---    │
│ str  ┆ i64    ┆ i64    ┆ i64    │
╞══════╪════════╪════════╪════════╡
│ foo  ┆ 1      ┆ 2      ┆ 3      │
│ foo  ┆ 7      ┆ 8      ┆ 9      │
│ bar  ┆ 4      ┆ 5      ┆ 6      │
│ bar  ┆ 1      ┆ 0      ┆ 1      │
└──────┴────────┴────────┴────────┘

可以看到,原始的列名(foo, bar)变成了新列 Name 的值,而每个列表中的元素则被展开成了 Value0, Value1, Value2 等独立的列。

逐步实现数据框重塑

要实现上述转换,我们需要执行以下三个关键步骤:

1. 使用 unpivot 将列名转换为值

unpivot 操作(在其他库中也常被称为 melt)用于将数据框的“宽”格式转换为“长”格式。它会将指定列的列名转换为一个新列的值,并将这些列的对应值放入另一个新列。

在这个例子中,我们将 foo 和 bar 列进行 unpivot 操作。variable_name="Name" 参数指定了存储原始列名的新列的名称,而默认情况下,原始列的值会存储在一个名为 value 的新列中。

# 步骤 1: unpivot
df_unpivoted = df.unpivot(variable_name="Name")
print("\n步骤 1: unpivot 后的数据框:")
print(df_unpivoted)

输出:

步骤 1: unpivot 后的数据框:
shape: (4, 2)
┌──────┬───────────┐
│ Name ┆ value     │
│ ---  ┆ ---       │
│ str  ┆ list[i64] │
╞══════╪═══════════╡
│ foo  ┆ [1, 2, 3] │
│ foo  ┆ [7, 8, 9] │
│ bar  ┆ [4, 5, 6] │
│ bar  ┆ [1, 0, 1] │
└──────┴───────────┘

现在,我们有了一个 Name 列(包含 foo 和 bar)和一个 value 列(包含原始的列表数据)。

魔法映像企业网站管理系统
魔法映像企业网站管理系统

技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

下载

2. 使用 list.to_struct 将列表转换为结构体

接下来,我们需要将 value 列中的每个列表转换为一个结构体(Struct)。结构体是一种复合数据类型,可以包含多个命名字段。这为我们将列表中的元素映射到独立的列提供了中间步骤。

pl.col("value").list.to_struct(fields=lambda x : f"Value{x}") 这行代码做了几件事:

  • pl.col("value"): 选中 value 列。
  • .list.to_struct(): 对列表列应用 to_struct 方法。
  • fields=lambda x : f"Value{x}": 这是关键部分。它定义了结构体中每个字段的名称。lambda x : f"Value{x}" 是一个匿名函数,它会为列表中的每个元素生成一个字段名,例如 Value0, Value1, Value2。x 在这里代表列表元素的索引。
# 步骤 2: 将列表转换为结构体
df_struct = df_unpivoted.with_columns(
    pl.col("value").list.to_struct(fields=lambda x : f"Value{x}")
)
print("\n步骤 2: 列表转换为结构体后的数据框:")
print(df_struct)

输出:

步骤 2: 列表转换为结构体后的数据框:
shape: (4, 2)
┌──────┬────────────────────┐
│ Name ┆ value              │
│ ---  ┆ ---                │
│ str  ┆ struct[3]          │
╞══════╪════════════════════╡
│ foo  ┆ {1,2,3}            │
│ foo  ┆ {7,8,9}            │
│ bar  ┆ {4,5,6}            │
│ bar  ┆ {1,0,1}            │
└──────┴────────────────────┘

现在 value 列的数据类型变为了 struct[3],其中包含了三个字段。

3. 使用 unnest 展开结构体列

最后一步是使用 unnest 操作。unnest 会将一个结构体列中的每个字段展开为数据框中的独立列。

# 步骤 3: 展开结构体列
df_final = df_struct.unnest("value")
print("\n步骤 3: 展开结构体列后的最终数据框:")
print(df_final)

输出:

步骤 3: 展开结构体列后的最终数据框:
shape: (4, 4)
┌──────┬────────┬────────┬────────┐
│ Name ┆ Value0 ┆ Value1 ┆ Value2 │
│ ---  ┆ ---    ┆ ---    ┆ ---    │
│ str  ┆ i64    ┆ i64    ┆ i64    │
╞══════╪════════╪════════╪════════╡
│ foo  ┆ 1      ┆ 2      ┆ 3      │
│ foo  ┆ 7      ┆ 8      ┆ 9      │
│ bar  ┆ 4      ┆ 5      ┆ 6      │
│ bar  ┆ 1      ┆ 0      ┆ 1      │
└──────┴────────┴────────┴────────┘

至此,我们成功地将原始数据框重塑为所需的格式。

完整代码示例

将上述三个步骤链式组合起来,可以得到一个简洁高效的解决方案:

import polars as pl

df = pl.DataFrame({
    "foo": [[1, 2, 3], [7, 8, 9]],
    "bar": [[4, 5, 6], [1, 0, 1]]
})

output_df = (
    df
    .unpivot(variable_name="Name")
    .with_columns(pl.col("value").list.to_struct(fields=lambda x : f"Value{x}"))
    .unnest("value")
)

print("\n最终重塑后的数据框:")
print(output_df)

注意事项与总结

  • 链式操作的优势: Polars 的表达式系统允许我们将多个操作链式调用,这不仅使代码更简洁,而且由于Polars的优化执行,通常效率更高。
  • fields 参数的灵活性: list.to_struct 中的 fields 参数非常灵活,可以是一个字符串列表,也可以是一个生成字段名的函数(如本例所示)。根据具体需求选择合适的方式。
  • 数据类型一致性: 确保列表中的所有子元素具有相同的数据类型,否则 to_struct 可能会遇到类型推断问题。
  • 适用于多种场景: 这种组合操作不仅适用于将列表展开为列,还可以作为更复杂数据重塑和特征工程的基础。例如,如果列表长度不固定,to_struct 可能会用 null 填充较短的列表以匹配最长列表的结构。

通过掌握 unpivot、list.to_struct 和 unnest 这三个强大的Polars操作,您将能够高效地处理和重塑包含列表数据的复杂数据框,为后续的数据分析和建模工作奠定坚实基础。

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

309

2023.10.31

php数据类型
php数据类型

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

222

2025.10.31

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

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

236

2023.09.22

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

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

458

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1501

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

2

2026.01.29

热门下载

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

精品课程

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

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