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

如何重置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:57:00