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

基于匹配索引层级末尾插入行实现两个多级索引DataFrame合并的程序化解决方案

解决多级索引DataFrame按层级末尾插入合并的问题

刚好碰到过类似的需求,咱们可以用分组拼接的思路来搞定这个问题——核心就是把df2里对应每个索引层级的行,都追加到df1同层级行的最后面,而且这个逻辑完全能适配大量同类场景。

先看咱们的示例数据(我统一把两个DataFrame的索引转成列,方便后续统一处理):

import pandas as pd
import numpy as np

# 生成df1
array1 = [["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"]]
tupples1 = list(zip(*array1))
index1 = pd.MultiIndex.from_tuples(tupples1, names=["first"])
df1 = pd.DataFrame(np.random.randn(8), index=index1).reset_index()

# 生成df2
array2 = [["bar", "bar","bar","qux","qux","qux","qux"]]
tupples2 = list(zip(*array2))
index2 = pd.MultiIndex.from_tuples(tupples2, names=["first"])
df2 = pd.DataFrame(np.random.randn(7), index=index2).reset_index()

接下来是核心处理逻辑,步骤非常清晰:

  1. 先获取两个DataFrame里所有唯一的索引值(避免遗漏任何一个层级)
  2. 遍历每个索引值,分别从df1和df2中取出对应行,把df2的行拼在df1行的后面
  3. 把所有拼接好的组合并成一个新的DataFrame
  4. 最后按需恢复多级索引

具体代码实现如下:

# 获取所有唯一的索引值(覆盖两个df的所有层级)
unique_indices = pd.unique(pd.concat([df1['first'], df2['first']]))

# 初始化空列表存放每个组的拼接结果
combined_groups = []

for idx in unique_indices:
    # 取出df1中当前索引的行
    df1_group = df1[df1['first'] == idx]
    # 取出df2中当前索引的行
    df2_group = df2[df2['first'] == idx]
    # 将df2的组追加到df1组末尾,忽略原索引避免重复
    combined = pd.concat([df1_group, df2_group], ignore_index=True)
    combined_groups.append(combined)

# 合并所有组得到最终结果
df_final = pd.concat(combined_groups, ignore_index=True)

# 如果需要恢复多级索引格式
df_final_multi = df_final.set_index('first')

咱们验证下结果结构:最终的df_final里,行顺序会是bar(df1的2行 + df2的3行)→ baz(仅df1的2行)→ foo(仅df1的2行)→ qux(df1的2行 + df2的4行),完全匹配你预期的输出结构。

这个逻辑的优势是通用扩展性强:哪怕你的多级索引有2层、3层,只要把筛选条件改成按所有索引列组合筛选就行;而且不管两个DataFrame的索引层级有没有交集,都能自动处理(比如df1有foo但df2没有,就只会保留df1的对应行)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:22:45