如何在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
相关产品推荐
相关产品推荐

