You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多索引DataFrame的列名转为第三级索引?

解决方法:用Pandas的stack()快速实现列转三级索引

你不需要用循环加groupby,Pandas内置的stack()方法就是干这个的,一步就能把列名转成第三级索引,再调整下索引名称和列名就搞定了。

步骤示例

先给你个小例子模拟你的数据结构,再演示操作:

1. 构造模拟数据

import pandas as pd
import numpy as np

# 模拟你的多级索引(Region + years)
index = pd.MultiIndex.from_product(
    [['São Paulo', 'Rio de Janeiro'], [2019, 2020, 2021]],
    names=['Region', 'years']
)
# 模拟产品列(这里只列3个做示例,你实际是95个)
products = ['Abacate', 'Abóbora (inclui butternut)', 'Banana']
df = pd.DataFrame(np.random.rand(6, 3), index=index, columns=products)

2. 转成目标三级索引结构

有两种方式,看你需要哪种形式:

方式一:保持多级索引结构

直接用stack()把列转成第三级索引,然后设置索引名称、把数值转成指定列:

# 列转第三级索引,同时把数值转为名为Productivity的列
result = df.stack().to_frame('Productivity')
# 给第三级索引命名为Products
result.index.names = ['Region', 'years', 'Products']
方式二:把索引转为普通列(方便后续筛选)

如果需要把三级索引都变成普通列,加个reset_index():

result = df.stack().reset_index(name='Productivity')
# 把自动生成的level_2列重命名为Products
result = result.rename(columns={'level_2': 'Products'})

为什么不用循环groupby?

stack()是Pandas专门为这种"列转索引"场景设计的优化方法,比循环高效太多,而且能完美保留多级索引的关联关系,不会出现循环中容易犯的索引对齐错误。

内容的提问来源于stack exchange,提问作者bdzh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:15:30