新闻中心
Pandas DataFrame高级重塑:将多级列索引转换为行索引与合并列名

本文详细介绍了如何使用Pandas库对DataFrame进行高级重塑操作。我们将一个具有多级列索引(如岛屿和年份)以及月份作为行索引的DataFrame,转换成以岛屿名称作为行索引,并以合并后的月份和年份(例如“JAN2025”)作为单级列索引的新结构。核心步骤包括利用stack()进行堆叠、transpose()进行转置,以及Index.map()来扁平化和自定义列名,从而实现数据的灵活布局。
在数据分析和报告生成中,我们经常需要根据特定的分析需求来重塑Pandas DataFrame的结构。本教程将展示一个常见的重塑场景:如何将一个具有多级列索引(MultiIndex columns)和单级行索引的DataFrame,转换为一个以原始DataFrame的某个列级别作为新的行索引,并将其余索引级别合并为新的单级列索引的DataFrame。
初始DataFrame结构
假设我们有一个DataFrame,其结构如下所示。它包含了不同岛屿(St Thomas, St. Croix)在不同年份(2025, 2025)的月度数据,月份作为行索引。
Island St Thomas St. Croix Year2025 2025 2025 2025 Month JAN 55,086 60,470 11,550 12,755 FEB 57,929 56,826 12,441 13,289 MAR 72,103 64,249 14,094 15,880 APR 67,469 56,321 12,196 13,092 MAY 60,092 49,534 13,385 16,497 JUN 67,026 56,950 14,009 15,728 JUL 66,353 61,110 13,768 16,879 AUG 50,660 42,745 10,673 12,102 SEP 24,507 25,047 6,826 6,298 OCT 34,025 34,462 10,351 9,398 NOV 44,500 NaN 9,635 NaN DEC 58,735 NaN 12,661 NaN
我们的目标是将此DataFrame转换为一个具有两行(分别代表“St Thomas”和“St. Croix”)和24列(例如“JAN2025”、“FEB2025”等)的结构。
核心重塑操作
为了实现上述目标,我们将利用Pandas的stack()、transpose()(或其简写.T)以及Index.map()方法。
1. 使用 stack() 堆叠最内层列索引
DataFrame.stack()方法用于将DataFrame的“宽”格式转换为“长”格式。它将DataFrame的列(或指定级别)“堆叠”到行索引上,从而产生一个Series或一个具有MultiIndex行的新DataFrame。
在这个例子中,我们的列索引是('Island', 'Year')的多级索引。默认情况下,stack()会堆叠最内层(即Year)的列索引。执行df.stack()后,Year级别将从列索引移动到行索引,与原有的Month索引形成一个MultiIndex行。
# 假设df是上面描述的初始DataFrame
# df = ... (通过前置代码生成)
# 堆叠最内层列索引 'Year'
stacked_df = df.stack()
print("--- After stack() ---")
print(stacked_df)此时,stacked_df的结构将是:
Island St Thomas St. Croix
Month Year
JAN 2025 55,086 11,550
2025 60,470 12,755
FEB 2025 57,929 12,441
2025 56,826 13,289
...
DEC 2025 58,735 12,661现在,Month和Year是行索引,而Island是列索引。
2. 使用 transpose() 转置DataFrame
DataFrame.transpose()(或简写.T)方法用于交换DataFrame的行和列。在我们的场景中,我们希望Island成为行索引,而Month和Year的组合成为列索引。
Yaara
使用AI生成一流的文案广告,电子邮件,网站,列表,博客,故事和更多…
95
查看详情
对stacked_df执行转置操作:
transposed_df = stacked_df.T
print("\n--- After transpose() ---")
print(transposed_df)转置后的transposed_df将具有以下结构:
Month JAN FEB MAR ... NOV DEC Year 2025 2025 2025 2025 2025 2025 ... 2025 2025 Island ... St Thomas 55,086 60,470 57,929 56,826 72,103 64,249 ... 44,500 58,735 St. Croix 11,550 12,755 12,441 13,289 14,094 15,880 ... 9,635 12,661
现在,Island成为了行索引,而列索引是Month和Year组成的多级索引。这已经非常接近我们的目标了。
3. 使用 Index.map() 扁平化和自定义列名
最后一步是将多级列索引('Month', 'Year')扁平化为单个字符串,例如“JAN2025”。我们可以通过Index.map()方法,结合一个lambda函数来实现这一点。
Index.map()允许我们对索引中的每个元素应用一个函数,并返回一个新的索引。对于一个MultiIndex,每个元素是一个元组(例如 ('JAN', '2025'))。
# 扁平化列索引
transposed_df.columns = transposed_df.columns.map(lambda x: f'{x[0]}{x[1]}')
# 或者使用更简洁的方式
# transposed_df.columns = map(''.join, transposed_df.columns)
out = transposed_df
print("\n--- Final Output ---")
print(out)最终输出的DataFrame out 将符合我们的要求:
JAN2025 JAN2025 FEB2025 FEB2025 MAR2025 MAR2025 APR2025 APR2025 MAY2025 MAY2025 JUN2025 JUN2025 JUL2025 JUL2025 AUG2025 AUG2025 SEP2025 SEP2025 OCT2025 OCT2025 NOV2025 DEC2025 Island St Thomas 55,086 60,470 57,929 56,826 72,103 64,249 67,469 56,321 60,092 49,534 67,026 56,950 66,353 61,110 50,660 42,745 24,507 25,047 34,025 34,462 44,500 58,735 St. Croix 11,550 12,755 12,441 13,289 14,094 15,880 12,196 13,092 13,385 16,497 14,009 15,728 13,768 16,879 10,673 12,102 6,826 6,298 10,351 9,398 9,635 12,661
完整代码示例
为了演示的完整性,下面提供了生成初始DataFrame并执行重塑操作的完整代码:
import pandas as pd
import tabula
# --- 原始DataFrame的生成代码 (来自问题描述) ---
page_number = "1"
pdf_url = "https://usviber.org/wp-content/uploads/2025/12/A23-OCT.pdf"
tables = tabula.read_pdf(pdf_url, pages=page_number)
df = tables[1]
numeric_columns = df.select_dtypes(include=["number"])
df = df.drop(numeric_columns.columns[(numeric_columns < 0).any()], axis=1)
df = df.loc[2:13, :].iloc[:, :5]
df.set_index(df.columns[0], inplace=True)
df.columns = pd.MultiIndex.from_product(
[["St Thomas", "St. Croix"], ["2025", "2025"]], names=["Island", "Year"]
)
df.index = df.index.map(lambda x: str(x).upper()[:3])
df.index.set_names("Month", inplace=True)
print("--- Initial DataFrame ---")
print(df)
# --- 重塑操作 ---
# 1. 堆叠最内层列索引 'Year'
stacked_df = df.stack()
# 2. 转置DataFrame,使'Island'成为行索引
transposed_df = stacked_df.T
# 3. 扁平化多级列索引,合并'Month'和'Year'
transposed_df.columns = transposed_df.columns.map(lambda x: f'{x[0]}{x[1]}')
# 最终结果
out = transposed_df
print("\n--- Final Reshaped DataFrame ---")
print(out)注意事项与总结
- stack() 的层级控制:stack() 默认会堆叠最内层的列索引。如果需要堆叠特定层级的列索引,可以使用 stack(level=...) 参数。
- unstack() 的反向操作:unstack() 是 stack() 的逆操作,它将行索引的某个级别转换为列索引。
- 处理 NaN 值:在重塑过程中,如果原始数据包含 NaN 值,这些 NaN 值会保留在重塑后的DataFrame中。在某些情况下,你可能需要在重塑前后进行缺失值处理(例如填充、删除)。
- 索引命名:在整个过程中,保持索引和列的良好命名习惯(通过 set_names())有助于代码的可读性和可维护性。
- 灵活性:stack(), transpose(), unstack(), pivot_table(), melt() 等Pandas函数提供了强大的数据重塑能力,理解它们的工作原理对于高效处理复杂数据结构至关重要。
通过结合使用 stack()、transpose() 和 Index.map(),我们可以灵活地将复杂的MultiIndex DataFrame重塑为满足特定分析和展示需求的结构。这种方法在处理时间序列数据、交叉表格数据或需要改变数据透视角度时尤其有用。
以上就是Pandas DataFrame高级重塑:将多级列索引转换为行索引与合并列名的详细内容,更多请关注其它相关文章!
# 是一个
# 邯郸网站优化哪个公司好
# 灵寿旅游网站建设
# seo展现次数
# 阿里妈妈网站推广备案
# 潼南关键词排名优化
# 体育赛事网站广告推广
# 学校网站建设推广平台
# 六安网站建设论文题目
# 金华网站建设动态信息
# 济南综合网站建设
# pdf
# 过程中
# 如何实现
# 它将
# 自定义
# 我们可以
# 扁平化
# 数据结构
# 高质量
# 转换为
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何在Promise链中优雅地中断后续then执行
腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
J*a递归快速排序中静态变量的状态管理与陷阱
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
J*a应用程序首次运行自动创建文件与目录的最佳实践
在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
58动漫网在线官方网 58动漫网正版动漫入口网址
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达
Python中高效访问嵌套字典与列表中的键值对
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
Linux如何构建多环境配置管理_Linux多环境配置方案
Go语言中JSON数据解码与字段访问指南
AO3官方可用镜像 Archive of Our Own网页版最新入口
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
React列表渲染与独立状态管理:避免全局状态影响局部更新
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
AO3最新可访问网址 Archive of Our Own官方在线入口
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】
12306选座系统怎么选连座_12306选座多人连坐操作方法
R星幕后开发视频泄露 包含《GTA6》等多款大作
如何仅使用CSS更改登录界面背景图像图标的颜色
小米14应用无法联网原因分析_小米14网络权限修复
照顾宝贝2小游戏点击立即在线玩
QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
优化Log4j2控制台输出性能:解决异步日志瓶颈
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
如何更改在 Excel 中打开超链接时的默认浏览器
DLsite中文平台入口 DLsite官网内容在线查看
荣耀Play7T运行卡顿解决_荣耀Play7T性能优化
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
微信客户端如何收红包_微信客户端接收红包使用教程
从J*aScript对象中精确提取指定属性的教程
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
深入理解Google Cloud Datastore查询:祖先路径与数据一致性
字由网在线版登录地址 字由网网页版安全入口
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】


2025-11-10
浏览次数:次
返回列表
2025 2025 2025 2025
Month
JAN 55,086 60,470 11,550 12,755
FEB 57,929 56,826 12,441 13,289
MAR 72,103 64,249 14,094 15,880
APR 67,469 56,321 12,196 13,092
MAY 60,092 49,534 13,385 16,497
JUN 67,026 56,950 14,009 15,728
JUL 66,353 61,110 13,768 16,879
AUG 50,660 42,745 10,673 12,102
SEP 24,507 25,047 6,826 6,298
OCT 34,025 34,462 10,351 9,398
NOV 44,500 NaN 9,635 NaN
DEC 58,735 NaN 12,661 NaN