新闻中心
Pandas数据重塑教程:高效堆叠多列的多种方法

本文详细介绍了在pandas dataframe中将多列堆叠并重塑为更简洁结构的三种高效方法。通过实例代码,分别演示了如何利用multiindex、`melt`与`pivot`组合以及`janitor`库的`pivot_longer`函数来实现数据从宽格式到长格式的转换,旨在帮助用户根据具体场景选择最合适的重塑策略,提升数据处理效率。
在数据分析和处理中,经常需要对DataFrame的结构进行调整,以适应不同的分析需求或模型输入。其中一个常见场景是将多个具有相似语义的列堆叠(stack)成少数几列,同时引入一个标识原始列来源的新列。例如,将包含左右侧(left_和right_)计数(_count)和总和(_sum)的列重塑为包含side、count和sum的更紧凑格式。
考虑以下初始DataFrame:
import pandas as pd
df = pd.DataFrame({
'date': ['2025-12-01', '2025-12-05', '2025-12-07'],
'other_col': ['a', 'b', 'c'],
'right_count': [4, 7, 9],
'right_sum': [2, 3, 5],
'left_count': [1, 8, 5],
'left_sum': [0, 8, 4]
})
print("原始DataFrame:")
print(df)期望的输出格式如下:
date other_col side count sum 0 2025-12-01 a right 4 2 1 2025-12-05 b right 7 3 2 2025-12-07 c right 9 5 3 2025-12-01 a left 1 0 4 2025-12-05 b left 8 8 5 2025-12-07 c left 5 4
下面将介绍三种实现此重塑目标的方法。
方法一:利用MultiIndex和stack进行自定义重塑
这种方法通过巧妙地构建一个临时的MultiIndex(多级索引)来组织列,然后使用stack操作将数据从宽格式转换为长格式。
CA.LA
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
- 设置索引:首先,将不需要重塑的列(如date, other_col)设置为DataFrame的索引。
- 创建MultiIndex列:将剩余的列名(如right_count, left_sum)通过下划线_拆分,创建两级列索引,其中第一级表示side(如right, left),第二级表示度量类型(如count, sum)。
- 重命名列轴:为MultiIndex的列轴命名,使其更具可读性。
- 堆叠:使用stack('side')将第一级列索引(side)堆叠到行索引中。
- 重置索引:最后,将所有索引重置为列,并清理生成的列名。
out_multiindex = (df
.set_index(['date', 'other_col']) # 1. 设置索引
.pipe(lambda x: x.set_axis(x.columns.str.split('_', expand=True), axis=1)) # 2. 创建MultiIndex列
.rename_axis(columns=['side', None]) # 3. 重命名列轴
.stack('side') # 4. 堆叠'side'层
.reset_index() # 5. 重置索引
)
print("\n方法一:使用MultiIndex和stack")
print(out_
multiindex)注意事项: 这种方法非常灵活,适用于列名具有清晰分隔符,并且需要将特定层级的列名转换为新列的场景。它要求对Pandas的MultiIndex操作有一定理解。
方法二:结合melt和pivot操作
melt和pivot是Pandas中进行数据重塑的两个核心函数,它们组合起来可以实现复杂的宽长格式转换。
- melt操作:首先,使用melt函数将所有需要重塑的列“融化”到一个新的value列中,同时创建一个side(这里暂时命名为var_name)列来存储原始的列名。
- 拆分列名:将melt生成的side列(如right_count)拆分为两部分:实际的side(right或left)和度量类型(count或sum)。
- pivot操作:最后,使用pivot函数,将拆分出的度量类型作为新的列名,value列的数据填充到这些新列中,并以date、other_col和side作为新的行索引。
- 重置索引和清理:重置索引并清理pivot操作可能留下的MultiIndex列名。
tmp = df.melt(['date', 'other_col'], var_name='temp_col') # 1. melt操作
# 2. 拆分列名
tmp[['side', 'col_type']] = tmp['temp_col'].str.split('_', n=1, expand=True)
out_melt_pivot = (tmp.pivot(index=['date', 'other_col', 'side'],
columns='col_type', values='value') # 3. pivot操作
.reset_index() # 4. 重置索引
.rename_axis(columns=None) # 清理列名
)
print("\n方法二:结合melt和pivot")
print(out_melt_pivot)注意事项: melt和pivot是Pandas中非常常用的重塑工具,理解它们的工作原理对于处理各种数据格式至关重要。这种方法通常更易于理解和调试,因为它将重塑过程分解为几个逻辑步骤。
方法三:使用janitor库的pivot_longer函数
对于更复杂的重塑任务,或者当需要更简洁的语法时,可以考虑使用第三方库pyjanitor。它提供了类似R语言tidyr包的pivot_longer功能,能够以更声明式的方式处理宽长格式转换。
-
安装janitor:如果尚未安装,需要先安装pyjanitor库。
pip install pyjanitor
- 导入janitor:在代码中导入janitor。
- 使用pivot_longer:指定不变的索引列(index),以及如何将原始列名映射到新的列(names_to)和如何解析原始列名(names_pattern)。names_pattern使用正则表达式来捕获列名的不同部分。
# pip install pyjanitor
import janitor
out_janitor = df.pivot_longer(index=['date', 'other_col'],
names_to=('side', '.value'),
names_pattern=r'([^_]+)_([^_]+)')
print("\n方法三:使用janitor库的pivot_longer")
print(out_janitor)注意事项: janitor库的pivot_longer函数提供了强大的正则表达式匹配能力,使得处理具有复杂命名模式的列变得非常简单。.value占位符指示匹配到的部分应该直接作为新的列名,而不是作为新列的值。虽然引入了外部依赖,但对于频繁进行复杂重塑的用户来说,它可以显著提高代码的可读性和开发效率。
总结
本文介绍了在Pandas DataFrame中将多列堆叠并重塑为更简洁结构的三种主要方法:
- MultiIndex与stack:适用于列名具有清晰分隔符,且希望通过构建多级列索引来灵活控制堆叠过程的场景。它提供了底层控制的强大能力。
- melt与pivot组合:这是一种经典且通用的方法,通过将数据先“融化”再“透视”,分步实现重塑。它逻辑清晰,易于理解和调试,是Pandas数据重塑的基石。
- janitor.pivot_longer:对于追求简洁和声明式语法的用户,特别是当列名模式复杂时,pyjanitor库提供的pivot_longer是一个非常高效且直观的选择,它利用正则表达式简化了列名解析过程。
选择哪种方法取决于具体的数据结构、个人偏好以及对库的熟悉程度。在实际应用中,建议根据数据的复杂性和团队的习惯,选择最适合的工具来高效完成数据重塑任务。
以上就是Pandas数据重塑教程:高效堆叠多列的多种方法的详细内容,更多请关注其它相关文章!
# 应用技巧
# SEO工作室沙发
# 商铺出租推广网站有哪些
# 海纳网站建设
# 松原seo推广推荐招聘
# 康平网站建设包括什么
# 网络推广和网站推广计划
# 威海seo的工作流程
# 沭阳手机网站建设
# 家政行业信息流推广营销
# 沂源seo优化资讯
# 正则表达式
# 重命名
# 移除
# 中非
# 转换为
# 这种方法
# 适用于
# 三种
# 数据结构
# 工具
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何在 Windows 11 中启动游戏手柄设置
css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容
一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰
曝R星经典之作开发图 设计简陋但信息密集!
2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
iCloud登录入口网页版 苹果iCloud官网登录
Go语言JSON解析深度指南:动态访问与结构体映射实践
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
Python Socket多播通信中指定源IP地址的实践指南
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
苹果手机如何防止被恶意App追踪
CSS布局中意外空白:解决padding-top导致的顶部间距问题
React Hooks最佳实践:动态组件状态管理的组件化方案
J*aScript异步迭代器_j*ascript异步遍历
星露谷物语官网入口 星露谷物语游戏官网入口
千牛数据看板网页版_千牛数据看板网页版访问方法
Spring Boot嵌入式服务器与J*a EE:功能支持深度解析
R星幕后开发视频泄露 包含《GTA6》等多款大作
outlook中文官网入口地址 outlook官方中文版直达首页链接
在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
12306几点到几点不能订票? | 官方最新系统维护时间全解析
解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
J*aScript中在Map循环中检测并处理空数组元素
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
HTML空白字符处理机制:渲染、DOM与编码实践
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
在Typer应用中优雅地处理和重组任意命令行参数
C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
qq游戏大厅官方下载_qq游戏免费下载安装入口
Golang并发任务中错误如何聚合_Golang goroutine error收集方式
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
谷歌推RCS信息存档功能:公司可监控员工私密信息!
mysql如何设置表访问权限_mysql表访问权限配置
在J*a项目里如何构建对象之间的契约_接口约束的实际落地
夸克浏览器图书入口 夸克手机浏览器阅读入口
c++ 获取系统当前时间 c++时间戳获取方法
React Router v6 教程:构建认证保护的私有路由与重定向策略


2025-11-19
浏览次数:次
返回列表
multiindex)