如何修改多层索引DataFrame的表头?解决层级不足报错
如何将DataFrame双层表头修改为三层表头?
问题场景
我有如下代码生成的DataFrame:
from collections import defaultdict import pandas as pd dic = {'US':{'Traffic':{'new':1415, 'repeat':670}, 'Sales':{'new':67068, 'repeat':105677}}, 'UK': {'Traffic':{'new':230, 'repeat':156}, 'Sales':{'new':4568, 'repeat':10738}}} d1 = defaultdict(dict) for k, v in dic.items(): for k1, v1 in v.items(): for k2, v2 in v1.items(): d1[(k, k2)].update({k1: v2}) df = pd.DataFrame.from_dict(d1, orient='index').reset_index() df.columns = ['Country', 'Type', 'Traffic', 'Sales'] # 插入空列和Mode列 df.insert(loc=2, column=' ', value=None) df.insert(loc=0, column=('', 'Mode'), value='Website') # 设置双层表头的层级名称 df.columns = df.columns.rename("Q3", level=0) df.columns = df.columns.rename("Metric", level=1)
当前表头是双层MultiIndex结构,层级名称分别为Q3(第一层)和Metric(第二层)。我想要改成三层结构:顶层所有列统一为Skateboard,中层为Q3,底层为对应指标名称,同时给三个层级分别设置名称(顶层叫Product,中层叫Q3,底层叫Metric)。
尝试以下代码时出现报错:
df.columns = df.columns.rename("Skateboard", level=0) df.columns = df.columns.rename("Q3", level=1) df.columns = df.columns.rename("Metric", level=2)
报错信息:IndexError: Too many levels: Index has only 2 levels, not 3
解决方法
报错原因是当前表头只有2层,无法直接操作第3层。需要先将双层MultiIndex扩展为三层,再设置各层级名称:
步骤1:扩展表头为三层结构
给原双层表头的每个元组前添加固定元素'Skateboard',将其转为三层MultiIndex:
# 给每个列元组添加顶层元素"Skateboard" df.columns = pd.MultiIndex.from_tuples([('Skateboard',) + col for col in df.columns])
步骤2:设置各层级的名称
现在表头已变为三层结构,可分别给三个层级设置名称:
# 重命名三个层级的名称 df.columns = df.columns.rename("Product", level=0) # 顶层的名称 df.columns = df.columns.rename("Q3", level=1) # 中层的名称 df.columns = df.columns.rename("Metric", level=2) # 底层的名称
执行后就能得到目标的三层表头样式:顶层所有列元素为Skateboard,三个层级的名称分别为Product、Q3、Metric。
内容的提问来源于stack exchange,提问作者M J
相关产品推荐
相关产品推荐

