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

如何修改多层索引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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:35:15