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

本文详细介绍了如何使用Pandas库对具有多层列索引的DataFrame进行高效重塑。通过结合`stack()`、`transpose()`和`Index.map()`等核心函数,我们将演示如何将DataFrame的最低层列索引与原始行索引合并,生成新的扁平化列名,同时将原高层列索引转换为新的行索引,从而实现数据从宽到长的灵活转换。
在数据分析和处理中,我们经常需要根据特定的分析需求调整DataFrame的结构。当DataFrame包含多层列索引时,这种重塑操作可能显得复杂。本教程将以一个具体的案例为例,详细讲解如何将DataFrame的多层列索引中的特定层与行索引合并,创建新的扁平化列名,并将原始的高层列索引转换为新的行索引,最终得到一个更适合特定分析场景的二维表格。
初始DataFrame结构
假设我们有一个从PDF文件中提取并经过预处理的Pandas DataFrame,其结构如下所示。这个DataFrame的列是多层索引(MultiIndex),包含“Island”(岛屿)和“Year”(年份)两层,行索引是“Month”(月份)。
import pandas as pd import tabula # 示例数据加载与预处理(与原始问题保持一致) 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("原始DataFrame:") print(df)
原始DataFrame的输出结构如下:
Island St Thomas St. Croix Year 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
我们的目标是将“Island”(岛屿)作为新的行索引,并将“Month”(月份)与“Year”(年份)拼接成新的列名(例如“JAN2025”、“FEB2025”),最终得到一个2行24列的DataFrame。
重塑DataFrame的步骤
为了实现上述目标,我们将分三步进行操作:
1. 使用 stack() 转换列索引层级
stack() 函数用于将DataFrame的“列”转换为“行”。默认情况下,它会将DataFrame最内层的列索引(即Year)转换为新的行索引层级。这使得原始的Month和Year共同构成了新的行MultiIndex。
# 将最内层列索引 (Year) 堆叠到行索引
stacked_df = df.stack()
print("\n堆叠后的DataFrame (stacked_df):")
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此时,stacked_df 的列索引是 Island,行索引是 Month 和 Year 的 MultiIndex。
刺鸟创客
一款专业高效稳定的AI内容创作平台
110
查看详情
2. 使用 transpose() (或 .T) 转置DataFrame
在stack()操作之后,我们希望将Island从列转换为行,并将Month和Year的组合作为新的列。这时,使用transpose()方法(或其简写.T)可以实现行与列的互换。
# 转置DataFrame
out = stacked_df.T
print("\n转置后的DataFrame (out):")
print(out)out 的输出将是:
Month JAN FEB MAR APR ... NOV DEC Year 2025 2025 2025 2025 2025 2025 2025 2025 ... 2025 2025 Island ... St Thomas 55,086 60,470 57,929 56,826 72,103 64,249 67,469 56,321 ... 44,500 58,735 St. Croix 11,550 12,755 12,441 13,289 14,094 15,880 12,196 13,092 ... 9,635 12,661
现在,Island 已经成为了行索引,而列索引则变成了 Month 和 Year 的 MultiIndex。
3. 扁平化列MultiIndex
最后一步是将列索引中的Month和Year组合成单个字符串,例如“JAN2025”。我们可以通过对列索引应用 map() 函数来实现这一点。
# 扁平化列MultiIndex,将月份和年份拼接
out.columns = out.columns.map(lambda x: f'{x[0]}{x[1]}')
# 或者,对于简单的字符串拼接,也可以使用 map(''.join, out.columns)
# out.columns = map(''.join, out.columns)
print("\n最终重塑后的DataFrame:")
print(out)最终输出的DataFrame将符合我们的预期:
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
完整代码示例
将上述步骤整合到一起,完整的代码如下:
import pandas as pd
import tabula
# 1. 初始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)
# 2. 重塑操作
# 步骤1: 堆叠最内层列索引 (Year) 到行索引
stacked_df = df.stack()
# 步骤2: 转置DataFrame,使 'Island' 成为行索引,'Month'/'Year' 成为列MultiIndex
out = stacked_df.T
# 步骤3: 扁平化列MultiIndex,将月份和年份拼接
out.columns = out.columns.map(lambda x: f'{x[0]}{x[1]}')
print("\n最终重塑后的DataFrame:")
print(out)注意事项与总结
- stack() 的灵活性:stack() 默认会将最内层的列索引堆叠,但你可以通过 level 参数指定要堆叠的列索引层级。
- transpose() 的应用:.T 是 transpose() 的便捷方式,用于快速交换DataFrame的行和列。
- Index.map() 的强大功能:map() 方法不仅可以用于Series,也可以用于Index对象,对索引的每个元素应用一个函数,非常适合进行格式化或组合操作。
- 数据类型:在拼接列名时,确保索引中的元素是字符串类型或可转换为字符串的类型。f'{x[0]}{x[1]}' 这种f-string格式化方法非常灵活,可以处理不同类型的数据。
- NaN 值处理:在重塑过程中,如果原始数据中存在 NaN 值,它们会自然地保留在重塑后的DataFrame中。在某些情况下,你可能需要在重塑前后进行 fillna() 或 dropna() 操作。
通过掌握 stack()、transpose() 和 Index.map() 这三个Pandas核心函数,你可以高效地处理复杂的DataFrame重塑任务,将数据转换成最适合你分析需求的结构。这种方法在处理时间序列数据、面板数据或需要交叉分析多维度数据时尤其有用。
以上就是Pandas DataFrame多层索引重塑:将列索引与行索引合并为新列名的详细内容,更多请关注其它相关文章!
# 如何实现
# 电网营销服务推广员
# 银川SEO鱼刺系统排名
# 西安哪里做seo优化
# 网站短视频推广系统
# 宁波抖音seo新手快
# 崇左租房网站建设需要
# 坊子网站建设推广
# 加强网站建设论文题目
# 安徽哪家网站推广好
# seo是什么程序
# pdf
# 多维
# 如何将
# 会将
# 将是
# 并为
# 并将
# 扁平化
# 高质量
# 转换为
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
c++如何使用Meson构建系统_c++比CMake更快的构建工具
TikTok网页版直接登录 TikTok网页端官方平台入口
必由学官网首页入口 必由学教师网页版登录指南
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
ACG动漫视频网入口 ACG动漫*免费正版观看地址
必由学官方登录入口 必由学教师学生账号快速访问
Python实时数据流中的动态最值查找策略
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
深入理解J*a链表中的IPosition接口与使用
J*aScript动态修改指定div内所有a标签样式指南
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
LINUX怎么设置定时任务_LINUX crontab配置教程
2026春节假期票务安排_2026春节放假购票指南
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
基于动态规划的房屋花卉种植最小成本算法详解
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
Lar*el Excel导入时生成自定义递增ID的策略与实践
J*aScript中正确使用querySelectorAll与复杂CSS选择器
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
如何在J*a中使用Locale处理多语言环境
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
提升Kafka消费者健壮性:会话超时处理与消息处理语义
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景
反效果?《战地6》免费试玩开启后玩家数不升反降
vivo云服务网页版登录 怎么登录vivo云服务网页版
押井守高度称赞《辐射4》:玩了八年都停不下来!
Django表单提交验证失败后保持字段值不刷新
如何使用Go和Martini动态服务解码后的图片
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
蛙漫官方正版入口 蛙漫网页在线全集免费观看
学习通网页版官方登录 超星学习通电脑端入口指南
《GTA6》开发画面疑似泄露!这次可不是AI了
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
解决Bootstrap卡片顶部边距导致背景图下移的问题
vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧
不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|
生成rdflib自定义SPARQL函数:参数匹配与实践指南


2025-11-07
浏览次数:次
返回列表
df"
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("原始DataFrame:")
print(df)