Polars DataFrame中列表列的巧妙转换与展开


Polars DataFrame中列表列的巧妙转换与展开

本教程详细介绍了如何利用polars高效地将包含列表的宽格式dataframe转换为长格式,并同时将列表元素展开为独立的列。通过结合`unpivot`、`list.to_struct`和`unnest`等核心操作,读者将学会如何优雅地重塑数据,实现从原始的列名-列表值结构到name-value0/value1/value2等新列的转换,从而简化复杂的数据清洗和分析任务。

Polars中复杂列表列的重塑与展开

在数据处理中,我们经常会遇到包含列表类型数据的DataFrame,并且需要将其从宽格式转换为长格式,同时将列表中的元素展开成独立的列。Polars作为一款高性能的DataFrame库,提供了强大且富有表达力的API来应对这类挑战。本文将详细介绍如何通过一系列链式操作,实现对Polars DataFrame中列表列的特定方式转换。

初始数据结构与目标

假设我们有一个Polars DataFrame,其结构如下,其中"foo"和"bar"列都包含整数列表:

import polars as pl

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

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  ┆ 0      ┆ 1      ┆ 1      │
└──────┴────────┴────────┴────────┘

这个转换涉及到两个主要步骤:首先,将列名("foo", "bar")转换为一个名为"Name"的新列,并将它们对应的值放入一个名为"value"的新列中,即从宽格式到长格式的转换。其次,将"value"列中的列表元素展开为独立的列("Value0", "Value1", "Value2")。

转换步骤详解

Polars提供了一系列强大的表达式和方法来高效地完成这个转换。我们将分步进行说明。

步骤一:使用 unpivot 进行列名转换与长格式化

unpivot 方法用于将DataFrame的指定列(或所有非id_vars列)从宽格式转换为长格式。它会将列名转换为一个新列的行值,并将这些列的原始值放入另一个新列中。

在这个例子中,我们没有指定id_vars,所以所有列("foo", "bar")都将被unpivot。variable_name="Name"参数指定了存储原始列名的新列的名称。默认情况下,值列的名称是value。

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

df_unpivoted = df.unpivot(variable_name="Name")
print(df_unpivoted)
# 输出:
# shape: (4, 2)
# ┌──────┬───────────┐
# │ Name ┆ value     │
# │ ---  ┆ ---       │
# │ str  ┆ list[i64] │
# ╞══════╪═══════════╡
# │ foo  ┆ [1, 2, 3] │
# │ bar  ┆ [4, 5, 6] │
# │ foo  ┆ [7, 8, 9] │
# │ bar  ┆ [1, 0, 1] │
# └──────┴───────────┘

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

AI建筑知识问答 AI建筑知识问答

用人工智能ChatGPT帮你解答所有建筑问题

AI建筑知识问答 172 查看详情 AI建筑知识问答

步骤二:使用 list.to_struct 将列表转换为结构体

在Polars中,要将列表的元素展开为单独的列,通常需要先将列表转换为结构体(Struct)。list.to_struct() 方法正是为此目的设计的。它将列表中的每个元素映射到结构体的一个字段。

fields 参数允许我们自定义结构体中字段的名称。在这里,我们使用一个lambda函数 lambda x: f"Value{x}" 来为每个列表元素生成字段名,例如"Value0", "Value1", "Value2"等。

df_struct = df_unpivoted.with_columns(
    pl.col("value").list.to_struct(fields=lambda x: f"Value{x}")
)
print(df_struct)
# 输出:
# shape: (4, 2)
# ┌──────┬───────────────────────────┐
# │ Name ┆ value                     │
# │ ---  ┆ ---                       │
# │ str  ┆ struct[3]                 │
# ╞══════╪═══════════════════════════╡
# │ foo  ┆ {1,2,3}                   │
# │ bar  ┆ {4,5,6}                   │
# │ foo  ┆ {7,8,9}                   │
# │ bar  ┆ {1,0,1}                   │
# └──────┴───────────────────────────┘

现在,value列已经从list[i64]类型变为了struct[3]类型,其中包含了三个字段,默认名称为field_0, field_1, field_2(或者根据我们lambda函数生成的名称)。

步骤三:使用 unnest 展开结构体列

最后一步是使用 unnest 方法将结构体列展开为独立的列。只需指定要unnest的列名,Polars就会自动将其内部的字段提升为DataFrame的顶层列。

df_final = df_struct.unnest("value")
print(df_final)
# 输出:
# shape: (4, 4)
# ┌──────┬────────┬────────┬────────┐
# │ Name ┆ Value0 ┆ Value1 ┆ Value2 │
# │ ---  ┆ ---    ┆ ---    ┆ ---    │
# │ str  ┆ i64    ┆ i64    ┆ i64    │
# ╞══════╪════════╪════════╪════════╡
# │ foo  ┆ 1      ┆ 2      ┆ 3      │
# │ bar  ┆ 4      ┆ 5      ┆ 6      │
# │ foo  ┆ 7      ┆ 8      ┆ 9      │
# │ bar  ┆ 1      ┆ 0      ┆ 1      │
# └──────┴────────┴────────┴────────┘

至此,我们成功地将原始DataFrame转换成了目标格式。

完整代码示例

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

import polars as pl

# 原始DataFrame
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(output_df)

注意事项与总结

  • 性能优势: Polars的表达式系统和惰性计算(当使用scan_csv等时)使得这些复杂的数据转换操作在内存和CPU效率上都表现出色。
  • 灵活性: fields参数在list.to_struct中非常灵活,可以根据具体需求动态生成列名。如果列表长度不固定,list.to_struct会填充null值以保持结构体的一致性。
  • 错误处理: 确保列表中的元素类型一致,否则在转换为结构体时可能会遇到类型不匹配的问题。
  • 可读性: 链式操作虽然强大,但在处理非常复杂的转换时,适当拆分为多个步骤或添加注释可以提高代码的可读性。

通过掌握unpivot、list.to_struct和unnest这三个关键操作,您将能够高效地在Polars中处理和重塑包含列表的复杂DataFrame,从而解锁更多数据分析的可能性。

以上就是Polars DataFrame中列表列的巧妙转换与展开的详细内容,更多请关注其它相关文章!


# 就会  # 网络营销推广中的文章  # 宜春建设网站哪家好  # 韩国海外seo营销  # 济南制作网站推广哪家好  # 餐馆开张营销推广话术  # 正宗seo优化价格  # 中高端网站建设定做  # 周宁网站推广软件  # 驿城区附近网络推广营销  # 凤山街道全网营销推广  # csv  # 时将  # 列表中  # 详细介绍  # 并将  # 知识问答  # 数据结构  # 将其  # 链式  # 转换为  # 数据清洗 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 126邮箱网页在线登录2025_126邮箱网页版入口官方地址  微信客户端如何找回密码_微信客户端忘记密码找回方法  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】  PHP中实现JSON数据数组分页的教程  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  Flash AS3.0简易相册制作  mysql如何管理数据库账户_mysql数据库账户管理技巧  红手指专业版app注册教程  解决jQuery多计算器输入字段冲突的教程  哔哩哔哩黑名单怎么查看  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享  宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?  Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程  江苏大剧院会员卡购买步骤  除了Copilot,还有哪些值得一试的VS Code AI插件?  Linux如何自动分析系统异常日志_Linux日志智能检测  有道AI翻译入口 智能写作官方网站入口  基于键值条件高效映射 Pandas DataFrame 多列数据  圆通快递官方入口不需要登录 在线查询入口快速查询  学习通网页版个人登录_学习通网页版个人账户登录入口  《蓝色星原:旅谣》坐骑获取攻略  PHP utf8_encode 字符编码转换疑难解析与最佳实践  顺丰官方查单号入口 顺丰快递单号查询官网入口  获取WooCommerce产品在后台编辑页面的分类ID  《火影忍者:木叶高手》快速升级攻略  安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法  德邦物流在线查询系统 德邦快递货物运输追踪  键盘测试软件哪个好_键盘故障检测工具推荐  win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】  猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法  vivo手机视频通话美颜怎么设置_vivo视频通话美颜开启方法  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践  如何在CSS中使用过渡制作按钮边框渐变_border-color transition实现  美发店速赢秘籍  《密马》发布账号方法  使用document.execCommand实现Web文本编辑器加粗/取消加粗  斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来  追剧达人如何发弹幕  ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算  J*a中导出MySQL表为SQL脚本的两种方法  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  《理想汽车》权限管理设置方法  咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法  使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式  天天漫画2025最新入口 天天漫画永久有效登录入口  C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  J*a实现任务清单管理_集合框架综合入门练手  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接 

 2025-10-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.