如何按索引顺序交错合并两个 DataFrame

4次阅读

如何按索引顺序交错合并两个 DataFrame

本文介绍使用 pandas 的 concat 与稳定排序(sort_index(kind=”stable”))实现两表按原始索引位置交错拼接,严格保持 df1 索引0、df2 索引0、df1 索引1、df2 索引1…的交替顺序,适用于 SAP 数据导入等对行序敏感的场景。

本文介绍使用 pandas 的 `concat` 与稳定排序(`sort_index(kind=”stable”)`)实现两表按原始索引位置交错拼接,严格保持 df1 索引0、df2 索引0、df1 索引1、df2 索引1…的交替顺序,适用于 sap 数据导入等对行序敏感的场景。

在实际数据处理中,尤其是对接 ERP 系统(如 SAP)时,excel 文件的行顺序具有业务语义——例如需将主数据(df1)与对应附件标识(df2)严格交替排列,而非简单纵向叠或基于键值连接。此时,常规的 merge、join 或 append 均无法满足“索引0配对、索引1配对……”的交错需求。

正确解法是:先拼接,再按索引稳定排序。关键在于 pd.concat() 默认保留各 DataFrame 内部顺序,而 sort_index(kind=”stable”) 能确保相同索引值的行不发生内部顺序颠倒(即 df1 的行始终排在同索引 df2 行之前),从而精准复现目标结构。

以下为完整实现代码:

import pandas as pd  # 构造示例数据 df1 = pd.DataFrame({"x": ["one", "two", "three", "four", "five"],                      "y": [1, 2, 3, 4, 5]}) df2 = pd.DataFrame({"x": ["six", "seven", "eight", "nine", "ten"],                      "y": [6, 7, 8, 9, 10]})  # 交错合并:先拼接,再按索引稳定排序 result = pd.concat([df1, df2]).sort_index(kind="stable")  print(result)

输出结果完全符合预期:

x   y 0    one   1 0    six   6 1    two   2 1  seven   7 2  three   3 2  eight   8 3   four   4 3   nine   9 4   five   5 4    ten  10

⚠️ 注意事项:

  • 必须使用 kind=”stable”(Python 3.11+ / pandas ≥1.4.0 默认支持),否则普通 sort_index() 可能打乱同索引行的相对顺序;
  • 两表索引必须一致(如均为 range(0, n)),若索引不匹配,需先重置:df1.reset_index(drop=True);
  • 此方法不依赖列名对齐,仅依赖索引位置,因此即使列名不同也可通过 ignore_index=False 保持索引参与排序;
  • 导出至 Excel 时建议使用 result.to_excel(“output.xlsx”, index=False) 避免写入索引列(除非业务要求保留重复索引)。

该方案简洁、高效、可复现,是解决“索引驱动交错合并”问题的标准实践。

text=ZqhQzanResources