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

如何在不改动前两级的情况下重新索引pandas MultiIndex第三级

统一三级索引DataFrame的第三级索引并填充缺失值

没问题,我来帮你实现这个需求——让每个(first, second)分组下的third索引都统一为[1,2,3],缺失的位置用0填充,同时保留前两级索引的原有结构。

方法一:分组后重新索引(直观易懂)

我们可以通过groupby按前两级索引分组,然后对每个分组的第三级索引重新指定目标值,并用0填充缺失项:

import pandas as pd
import numpy as np

# 构造原始DataFrame
tuples = [('A', 'a', 1), ('A', 'a', 3), ('A', 'b', 3), ('B', 'c', 1), ('B', 'c', 2), ('B', 'c', 3), ('C', 'd', 2)]
idx = pd.MultiIndex.from_tuples(tuples, names=['first', 'second', 'third'])
df = pd.DataFrame(np.random.randn(7, 2), index=idx, columns=['col1', 'col2'])

# 定义目标第三级索引
target_third = [1, 2, 3]

# 分组后重新索引
df_reindexed = df.groupby(level=['first', 'second'], group_keys=False).apply(
    lambda x: x.reindex(target_third, level='third', fill_value=0)
)

print(df_reindexed)

这段代码的核心逻辑是:

  • groupby(level=['first', 'second']) 将每个(first, second)组合单独作为一个分组
  • apply 里的reindex为每个分组指定统一的第三级索引target_third
  • fill_value=0 自动为缺失的索引位置填充0
  • group_keys=False 避免分组键被额外添加到结果的索引中

方法二:Unstack+Stack(高效简洁)

另一种更高效的方式是先将第三级索引转成列,填充缺失值后再转回索引:

# 转换索引并填充
df_reindexed = (
    df.unstack(level='third')  # 将third索引转成列
      .reindex(columns=target_third, level='third', fill_value=0)  # 统一列(原third索引)并填充0
      .stack(level='third')  # 将列转回third索引
      .sort_index()  # 保证索引顺序和原始一致
)

print(df_reindexed)

这种方法适合数据量较大的场景,因为unstack和stack是pandas中针对多级索引的高效操作。

最终效果

两种方法都会得到你期望的结果:

col1     col2
first second third          
A     a      1     -0.999816 -0.599815
            2      0.000000  0.000000
            3     -0.277794 -0.453870
      b      1      0.000000  0.000000
            2      0.000000  0.000000
            3      1.116561  0.760010
B     c      1      1.018475 -0.667625
            2      0.695997  0.641531
            3      0.593724  0.265256
C     d      1      0.000000  0.000000
            2      1.133767  0.716083
            3      0.000000  0.000000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:04:18