如何重置Pandas MultiIndex多层索引中的单个索引层级
多层索引DataFrame重置第一层级索引解决方案
你需要的是按照第一层索引的连续块出现顺序重新编号,不改变原有数据顺序和第二层索引,以下是两种实现方式:
方法1:简洁内置方法(推荐易读)
利用groupby的ngroup方法,按第一层索引分组且不排序,直接生成按出现顺序的连续编号:
# 按第一层class的出现顺序生成连续编号,从0开始 new_class = df.groupby(level='class', sort=False).ngroup() # 重建多层索引,保留第二层name和索引名 df.index = pd.MultiIndex.from_arrays( [new_class, df.index.get_level_values('name')], names=df.index.names )
方法2:高性能偏移累加方法(适合大数据量)
不需要分组聚合,仅通过索引偏移判断新块,性能更高:
# 判断当前class值和前一个是否不同,累加得到块编号,减1适配从0开始的要求 new_class = df.index.get_level_values('class').ne(df.index.get_level_values('class').shift()).cumsum() - 1 # 重建多层索引 df.index = pd.MultiIndex.from_arrays( [new_class, df.index.get_level_values('name')], names=df.index.names )
完整验证代码
把你的原始数据生成代码和解决方案拼接即可直接运行验证:
import pandas as pd # 原始数据生成 index = pd.MultiIndex.from_tuples([('0', 'Albert'), ('0', 'Isaac'), ('0', "Charles"), ('1', 'James'), ('1', 'Paul'), ('0', 'Wolfgang'), ('0', 'Enrico'), ('0', "John"), ('1', 'Marie'), ('1', 'Carol'), ('2', "Solomon"), ("2", "Joseph"), ("2", "Phil"), ('2', 'Danielle')], names=['class', 'name']) columns = ('High', 'Average') df = pd.DataFrame([(98.8, 97.9), (100.0, 99.9), (76.5, 64.2), (99.3, 98.9), (87.2, 83.3), (98.8, 96.5), (100.0, 97.7), (88.6, 64.2), (99.3, 78.3), (87.2, 81.0), (78.8, 65.9), (99.0, 95.4), (86.1, 74.7), (97.9, 91.1)], index=index, columns=columns) # 执行替换逻辑,两种方法选一种即可 new_class = df.groupby(level='class', sort=False).ngroup() df.index = pd.MultiIndex.from_arrays( [new_class, df.index.get_level_values('name')], names=df.index.names ) # 打印结果验证 print(df)
运行后输出结果和你预期的完全一致。
内容的提问来源于stack exchange,提问作者HEP N008
相关产品推荐
相关产品推荐

