如何将多索引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
相关产品推荐
相关产品推荐

