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

如何移除多层索引DataFrame中重复的索引层级并保留一个?

处理多层索引中重复的索引层

问题背景

现有一个三层多层索引的DataFrame,前两层索引的名称和内容均为name,需要移除重复的name索引层,只保留一层name和year索引,目标结构如下:

quantity  price
name  year                 
name1 2020        10    100
      2021        15    150
name2 2020        20    200
      2021        25    250
name3 2020        30    300
      2021        35    350

测试数据构建代码:

import pandas as pd

# 创建多层索引
index = pd.MultiIndex.from_tuples([
    ('name1', 'name1', '2020'),
    ('name1', 'name1', '2021'),
    ('name2', 'name2', '2020'),
    ('name2', 'name2', '2021'),
    ('name3', 'name3', '2020'),
    ('name3', 'name3', '2021')
], names=['name', 'name', 'year'])

df = pd.DataFrame({
    'quantity': [10, 15, 20, 25, 30, 35],
    'price': [100, 150, 200, 250, 300, 350]
}, index=index)

失败的尝试

使用index.duplicated()筛选重复行无效,因为整行的三层索引组合并不重复;使用reset_index()后删除重复列则触发ValueError: cannot insert name, already exists错误。

解决方案

方法1:直接用droplevel移除重复索引层

直接删除第二层索引(索引位置从0开始计数为1):

df_cleaned = df.droplevel(1)

方法2:重新构建多层索引

提取第一层和第三层的索引值,重新创建MultiIndex:

new_index = pd.MultiIndex.from_tuples(
    [(x[0], x[2]) for x in df.index],
    names=['name', 'year']
)
df_cleaned = df.set_index(new_index)

方法3:重置索引后重命名列再重新设置索引

先重置索引,重命名重复列名后再重新设置索引:

df_reset = df.reset_index()
# 重命名第二个name列
df_reset = df_reset.rename(columns={'name': 'name_dup'}, level=0)
# 删除重复列并重新设置索引
df_cleaned = df_reset.drop('name_dup', axis=1).set_index(['name', 'year'])

执行以上任意一种方法,均可得到目标结构的DataFrame。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:15:03