如何扩展Pandas MultiIndex并插入递增数据?
问题:在MultiIndex DataFrame指定层级插入行并填充递增数值
原始数据
import pandas as pd import numpy as np df = pd.DataFrame( np.arange(0, 30).reshape(-1, 5), index=pd.MultiIndex.from_product([["a"], ["b", "c", "d"], ["e", "g"]]), columns= ["class", "type", "id", "name", "date"] )
输出:
class type id name date a b e 0 1 2 3 4 g 5 6 7 8 9 c e 10 11 12 13 14 g 15 16 17 18 19 d e 20 21 22 23 24 g 25 26 27 28 29
预期结果
希望在每个(a, x)组的e和g之间插入f行,f行的数值按b→0、c→1、d→2递增:
class type id name date a b e 0 1 2 3 4 f 0 0 0 0 0 g 5 6 7 8 9 c e 10 11 12 13 14 f 1 1 1 1 1 g 15 16 17 18 19 d e 20 21 22 23 24 f 2 2 2 2 2 g 25 26 27 28 29
错误尝试及结果
循环插入时错误地将所有f行都加到(a,b)组下,且排序后打乱了分组结构:
for i in range(3): df = pd.concat([df, pd.DataFrame([[i]*5], index=pd.Index([("a", "b", "f")]), columns=df.columns)]) df = df.sort_index(level=2)
输出:
class type id name date a b e 0 1 2 3 4 c e 10 11 12 13 14 d e 20 21 22 23 24 b f 0 0 0 0 0 f 1 1 1 1 1 f 2 2 2 2 2 g 5 6 7 8 9 c g 15 16 17 18 19 d g 25 26 27 28 29
正确实现方法
方法一:构造完整MultiIndex后填充
先生成包含e/f/g的完整多层索引,再填入原始数据,最后给f行赋值:
# 获取原始索引的前两层唯一值 level0 = df.index.get_level_values(0).unique() level1 = df.index.get_level_values(1).unique() # 构造包含e、f、g的完整MultiIndex new_index = pd.MultiIndex.from_product( [level0, level1, ["e", "f", "g"]], names=df.index.names ) # 创建新DataFrame并填充原始数据 new_df = pd.DataFrame(index=new_index, columns=df.columns) new_df.loc[df.index] = df.values # 为每个group的f行填充对应递增数值 for idx, l1_val in enumerate(level1): new_df.loc[("a", l1_val, "f")] = [idx]*5 # 确保索引排序正确 new_df = new_df.sort_index() print(new_df)
方法二:分组插入后合并
按前两层索引分组,每组内插入f行后再合并所有组:
groups = [] # 按前两层索引分组处理 for (l0, l1), group in df.groupby(level=[0,1]): # 确定当前group对应的递增数值 val = ["b", "c", "d"].index(l1) # 构造f行数据 f_row = pd.DataFrame( [[val]*5], index=pd.MultiIndex.from_tuples([(l0, l1, "f")]), columns=df.columns ) # 合并当前组和f行,并按第三层索引排序 combined = pd.concat([group, f_row]).sort_index(level=2) groups.append(combined) # 合并所有分组得到最终结果 new_df = pd.concat(groups) print(new_df)
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

