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

Pandas技术问题:如何重排MultiIndex层级?排序后如何重新编号该层级?

Pandas:重排MultiIndex层级并重新编号指定层级

没问题,针对你已经按letter层级排序后的MultiIndex DataFrame,要给第二个层级重新按组内连续编号(比如每个字母组内从0开始计数),可以用下面的方法轻松实现:

先还原你的示例DataFrame(方便演示)

首先我们先构造出你提供的这个排序后的DataFrame:

import pandas as pd

data = {'text': ['blah'] * 9}
# 按letter排序后的原始MultiIndex
original_index = pd.MultiIndex.from_tuples(
    [('a', 0), ('a', 3), ('a', 6), ('b', 1), ('b', 4), ('b', 7), ('c', 2), ('c', 5), ('c', 8)],
    names=['letter', 'num']
)
df = pd.DataFrame(data, index=original_index)

方法1:直接操作MultiIndex生成新编号

利用groupby(level='letter')分组后,用cumcount()生成组内连续序号,再替换原索引:

# 为每个letter组生成从0开始的连续编号
new_num_level = df.groupby(level='letter').cumcount()

# 构造新的MultiIndex,保留原letter层级,替换num层级
new_multi_index = pd.MultiIndex.from_arrays(
    [df.index.get_level_values('letter'), new_num_level],
    names=['letter', 'num']
)

# 给DataFrame设置新索引
df = df.set_index(new_multi_index)

方法2:先重置索引再重新赋值(更直观)

如果你觉得直接操作索引有点绕,也可以先把索引转成列,处理后再转回MultiIndex:

# 把MultiIndex转成普通列
df_reset = df.reset_index()
# 按letter分组后,给num列重新赋值为组内连续序号
df_reset['num'] = df_reset.groupby('letter').cumcount()
# 重新设置回MultiIndex
df = df_reset.set_index(['letter', 'num'])

最终效果

执行上面任意一种方法后,你的DataFrame会变成这样:

text
letter num         
a      0       blah
       1       blah
       2       blah
b      0       blah
       1       blah
       2       blah
c      0       blah
       1       blah
       2       blah

如果想要编号从1开始,只需要把cumcount()改成cumcount() + 1就可以啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:26:44