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

如何扩展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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:15:15