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

如何在MultiIndex DataFrame指定层级添加带NaN值的新索引?

为MultiIndex DataFrame的指定层级添加新索引

可以通过两种实用方式实现为MultiIndex指定层级添加新索引的需求,以下是针对你场景的具体实现:

首先重现你的示例数据:

import pandas as pd

# 示例数据
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
df = df.set_index([['one', 'two', 'three'], [1, 2, 3]])
df.index.names = ['first', 'second']

方法1:使用reindex结合自定义MultiIndex

先构造包含目标新索引的完整MultiIndex,再通过重新索引自动填充缺失值为NaN:

# 获取first层级的所有唯一值
first_levels = df.index.get_level_values('first').unique()

# 生成包含新索引的所有元组
new_index_list = []
for first_val in first_levels:
    # 获取当前first对应的原有second值
    original_seconds = df.xs(first_val, level='first').index
    # 追加原索引和新索引的组合
    new_index_list.extend([(first_val, sec) for sec in list(original_seconds) + ['new_index']])

# 创建新的MultiIndex
new_multi_idx = pd.MultiIndex.from_tuples(new_index_list, names=['first', 'second'])

# 重新索引得到结果
result_df = df.reindex(new_multi_idx)
print(result_df)

方法2:使用concat逐个添加新行

遍历每个first层级值,创建对应new_index的空行后合并到原DataFrame:

# 准备存储所有数据的列表
data_frames = [df]

for first_val in df.index.get_level_values('first').unique():
    # 构造新行的索引
    new_row_idx = pd.MultiIndex.from_tuples([(first_val, 'new_index')], names=['first', 'second'])
    # 创建全NaN的新行
    new_row = pd.DataFrame([[pd.NA]*len(df.columns)], columns=df.columns, index=new_row_idx)
    data_frames.append(new_row)

# 合并并排序索引
result_df = pd.concat(data_frames).sort_index()
print(result_df)

两种方法最终都会输出你期望的结果:

A    B    C
first   second               
one     1        1.0  4.0  7.0
        new_index NaN  NaN  NaN
two     2        2.0  5.0  8.0
        new_index NaN  NaN  NaN
three   3        3.0  6.0  9.0
        new_index NaN  NaN  NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:05:23