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

删除MultiIndex DataFrame行后,索引层级仍存已删值的解决方法

Pandas MultiIndex删除行后获取有效一级索引的解决方法

在使用MultiIndex DataFrame时,删除部分行后,调用row_dropped.index.levels[0]仍会返回包含已删除值的索引集合,导致遍历操作出错。以下是可复现的示例代码:

import pandas as pd
import numpy as np

# 构建MultiIndex DataFrame
arrays = [
    ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
    ["one", "two", "one", "two", "one", "two", "one", "two"],
]

tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"])
df = pd.DataFrame(np.random.randn(8,2), columns=['col1','col2'], index=index)

# 删除一级索引为"foo"的行
row_dropped = df.drop('foo')
print(row_dropped.index.levels[0])

执行后输出:

Index(['bar', 'baz', 'foo', 'qux'], dtype='object', name='first')

但期望输出应为:

Index(['bar', 'baz', 'qux'], dtype='object', name='first')

解决方法

方法1:直接获取当前存在的唯一一级索引

使用index.unique(level=0)方法,直接返回DataFrame中实际存在的一级索引值,适合直接用于遍历:

for zero_level_index in row_dropped.index.unique(level=0):
    print(row_dropped.loc[zero_level_index])

方法2:清理索引,移除未使用的层级值

调用index.remove_unused_levels()方法,重新整理MultiIndex,让levels只保留当前存在的索引值,后续调用levels[0]即可得到正确结果:

# 清理未使用的索引层级
row_dropped.index = row_dropped.index.remove_unused_levels()
# 此时输出的就是有效索引
print(row_dropped.index.levels[0])
# 遍历操作也能正常执行
for zero_level_index in row_dropped.index.levels[0]:
    print(row_dropped.loc[zero_level_index])

原因说明

Pandas的MultiIndex默认会保留原始的层级集合,这是出于性能优化的考虑——避免频繁修改索引结构带来的开销。因此删除行后,未使用的索引值不会自动从levels中移除,需要通过上述方法手动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:58:28