删除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
相关产品推荐
相关产品推荐

