新闻中心
将Pandas DataFrame中的多列堆叠重塑为规范化格式

本文旨在深入探讨如何利用Pandas库对DataFrame进行多列堆叠和重塑操作,以实现从宽格式到长格式的转换。我们将介绍三种主要方法:基于MultiIndex的自定义重塑、结合`melt`和`pivot`函数,以及使用`janitor`库中的`pivot_longer`功能。通过示例代码和详细解释,读者将掌握在处理具有特定命名模式(如`*_count`, `*_sum`)的列时,如何高效地将数据结构化,从而提升数据分析的灵活性和可读性。
在数据分析和处理中,我们经常会遇到需要将DataFrame从“宽”格式转换为“长”格式的场景。这种转换对于数据可视化、统计分析以及与特定工具集成至关重要。特别是当DataFrame中的列名遵循某种模式,例如side_metric(如left_count,right_sum),我们希望将这些模式分解,并将side和metric作为新的列。
考虑以下初始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)原始DataFrame结构如下:
date other_col right_count right_sum left_count left_sum 0 2025-12-01 a 4 2 1 0 1 2025-12-05 b 7 3 8 8 2 2025-12-07 c 9 5 5 4
我们的目标是将其重塑为以下“长”格式,其中side列表示“left”或“right”,count和sum则作为单独的度量列:
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进行自定义重塑
这种方法通过创建临时的MultiIndex列来实现灵活的数据重塑,步骤相对复杂但非常灵活。
- 设置索引: 首先,将不需要堆叠的列(如date, other_col)设置为DataFrame的索引。
- 创建MultiIndex列: 使用columns.str.split('_', expand=True)将列名(如right_count)拆分为多级索引(right, count)。
- 重命名轴: rename_axis(columns=['side', None])为新的多级列索引的第一级命名为side,第二级保持匿名。
- 堆叠: stack('side')将名为side的列索引级别转换为行索引。
- 重置索引: reset_index()将所有索引级别转换回普通列。
out_multiindex = (df
.set_index(['date', 'other_col'])
.pipe(lambda x: x.set_axis(x.columns.str.split('_', expand=True), axis=1))
.rename_axis(columns=['side', None])
.stack('side')
.reset_index()
)
print("\n方法一:MultiIndex重塑结果")
print(out_multiindex)输出示例(顺序可能不同):
date other_col side count sum 0 2025-12-01 a left 1 0 1 2025-12-01 a right 4 2 2 2025-12-05 b left 8 8 3 2025-12-05 b right 7 3 4 2025-12-07 c left 5 4 5 2025-12-07 c right 9 5
方法二:结合melt和pivot函数
这种方法分两步进行:首先使用melt将宽格式数据“融化”为长格式,然后使用pivot将其重新组织为所需的结构。
PictoGraphic
AI驱动的矢量插图库和插图生成平台
133
查看详情
- melt操作: df.melt(['date', 'other_col'], var_name='side')将除date和other_col之外的所有列转换为两列:side(包含原始列名)和value(包含对应的值)。
- 拆分列名: tmp['side'].str.split('_', n=1, expand=True)将side列中的原始列名(如right_count)拆分为side和col两部分。
- pivot操作: tmp.pivot(...)根据date, other_col, side作为新索引,col作为新列,value作为对应值进行透视。
- 清理: reset_index().rename_axis(columns=None)重置索引并清理透视产生的列名轴。
tmp = df.melt(['date', 'other_col'], var_name='temp_col_name')
tmp[['side', 'col']] = tmp['temp_col_name'].str.split('_', n=1, expand=True)
out_melt_pivot = (tmp.pivot(index=['date', 'other_col', 'side'],
columns='col', values='value')
.reset_index()
.rename_axis(columns=None)
)
print("\n方法二:melt + pivot重塑结果")
print(out_melt_pivot)输出示例(顺序可能不同):
date other_col side count sum 0 2025-12-01 a left 1 0 1 2025-12-01 a right 4 2 2 2025-12-05 b left 8 8 3 2025-12-05 b right 7 3 4 2025-12-07 c left 5 4 5 2025-12-07 c right 9 5
方法三:使用janitor库的pivot_longer
janitor是一个强大的Python库,提供了许多便捷的数据清洗和处理功能,其中包括pivot_longer,它旨在简化类似R语言tidyr包中的pivot_longer操作。这种方法通常更简洁、易读。
首先,确保安装了pyjanitor库:
pip install pyjanitor
然后,导入并使用pivot_longer:
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)关键参数解释:
- index: 指定作为新DataFrame索引的列(不参与堆叠的列)。
- names_to: 一个元组,用于指定如何将原始列名解析为新的列。
- 'side':匹配正则表达式捕获组中的第一个部分,并将其命名为side列。
- '.value':一个特殊关键字,表示匹配正则表达式捕获组中的剩余部分,并将其作为新的列名(如count和sum)。
- names_pattern: 一个正则表达式,用于从原始列名中提取信息。r'([^_]+)_([^_]+)'表示匹配一个或多个非下划线字符(第一个捕获组),后跟一个下划线,再后跟一个或多个非下划线字符(第二个捕获组)。
输出示例:
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方法:提供最大的灵活性,适用于列名模式复杂或需要精细控制中间步骤的场景。但代码可读性相对较低。
- melt + pivot方法:是Pandas内置的经典重塑组合,逻辑清晰,适用于大多数通用场景。理解melt和pivot的工作原理是掌握Pandas数据重塑的关键。
- janitor.pivot_longer方法:对于有规律的列名模式,此方法最为简洁和直观,大大提高了代码的可读性和编写效率。强烈推荐在日常数据处理中使用。
- 性能考量: 对于非常大的DataFrame,不同的重塑方法可能在性能上有所差异。通常,Pandas的内置函数经过高度优化,而外部库如janitor也会利用这些优化。在极端性能敏感的场景下,可以进行基准测试。
- 列名模式: 所有方法都依赖于对原始列名模式的理解和解析。确保正则表达式(在janitor方法中)或str.split(在Pandas内置方法中)能够准确地从列名中提取所需的部分。
- 数据类型: 重塑操作可能会改变列的数据类型,特别是当melt操作将不同类型的列值合并到value列时。在后续分析前,可能需要进行数据类型转换。
掌握这些Pandas数据重塑技术,将使您能够更有效地组织和分析数据,为后续的数据探索、建模和可视化奠定坚实基础。
以上就是将Pandas DataFrame中的多列堆叠重塑为规范化格式的详细内容,更多请关注其它相关文章!
# 将其
# 汽车网站建设的概述
# 台州宁津网站建设制作
# 免费模板怎么营销推广
# 网站的宣传推广功能
# 辽宁视频网站优化代理
# 合肥全网营销推广服务商
# 焦作营销推广代运营
# 网站优化首页设计软件
# 边塞旅游网站建设案例
# 速卖通站外营销推广方式
# 数据结构
# 所需
# python
# 适用于
# 多个
# 第一个
# 如何将
# 下划线
# 转换为
# 代码可读性
# 数据清洗
# 数据可视化
# 工具
# 正则表达式
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】
在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
vivo云服务网页版登录 怎么登录vivo云服务网页版
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖
将HTML动态表格多行数据保存到Google Sheet的教程
免费抖音短视频入口_抖音网页版短视频免费通道
SteamMachine定价或为699美元 大家想入手吗?
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
马斯克:Optimus 人形机器人复数形式为 Optimi
响应式图片在网页设计中的正确实现方法
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
深入理解J*a链表中的IPosition接口与使用
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
J*aScript中赋值与自增运算符的复杂交互与执行机制
虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
铃兰之剑为这和平的世界希里技能组及加点推荐
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
poki免费入口快捷访问 poki人气小游戏直接玩站点
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
zookeeper 都有哪些功能?
内存检查:在VS Code中调试C++时的内存视图
J*a中实现Go语言select通道多路复用机制
如何在J*a中使用Locale处理多语言环境
在python-socketio事件处理器中安全访问Flask应用上下文
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
Win11怎么开启省电模式_Win11电池节电模式自动开启
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】
Python类型检查:优化关联可选属性的Mypy推断策略
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
yy漫画网页版官方入口_yy漫画官网登录页面链接
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明
如何使用纯J*aScript判断Input元素是否在特定类容器内
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践


2025-11-24
浏览次数:次
返回列表