
本文介绍使用 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) 避免写入索引列(除非业务要求保留重复索引)。
该方案简洁、高效、可复现,是解决“索引驱动交错合并”问题的标准实践。









