
本文介绍如何使用 pd.concat() 配合稳定排序(kind="stable")实现两个同结构 DataFrame 按原始索引位置交错拼接,确保 df1 的索引0、df2 的索引0 交替出现在结果顶部,满足 SAP 导入等对行序严格敏感的场景需求。
本文介绍如何使用 `pd.concat()` 配合稳定排序(`kind="stable"`)实现两个同结构 dataframe 按原始索引位置交错拼接,确保 df1 的索引0、df2 的索引0 交替出现在结果顶部,满足 sap 导入等对行序严格敏感的场景需求。
在数据处理中,有时我们需要将两个结构一致(列名、类型相同)的 DataFrame 按索引位置对齐并交错合并——即 df1 的第 0 行与 df2 的第 0 行相邻,接着是 df1 的第 1 行与 df2 的第 1 行,依此类推。这种需求常见于 ERP 系统(如 SAP)的数据导入准备阶段,其中 Excel 行序直接影响业务逻辑或校验规则,不能依赖常规 merge/join(会重排、去重或产生笛卡尔积),也不能简单使用 append() 或 concat() 后默认排序(因默认 quicksort 不保证相等索引的相对顺序)。
正确解法是:先用 pd.concat() 垂直堆叠两个 DataFrame,再对结果按索引进行稳定排序(stable sort)。稳定排序能确保:当多个行具有相同索引值(如均为 0、均为 1)时,它们在输出中的相对顺序与输入拼接时的先后顺序完全一致——即 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]})
# 关键步骤:concat + 稳定索引排序
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 默认支持;旧版本可显式传入 kind='mergesort',它也是稳定的);
- pd.concat() 默认 ignore_index=False,保留原索引,这是实现交错的前提;
- 两表必须具有完全一致的列名与列数,否则 concat 会自动对齐并引入 NaN;
- 若需导出为 Excel 供 SAP 使用,建议后续使用 to_excel(..., index=False) ——但注意:SAP 导入模板通常依赖行序而非索引列,因此保留原始索引无影响;若需清除索引列,可在导出前调用 reset_index(drop=True),但务必在 sort_index(kind="stable") 之后执行,避免破坏顺序。
总结:pd.concat([df1, df2]).sort_index(kind="stable") 是解决“按索引位置交错合并”问题最简洁、可靠且性能良好的方案,兼顾语义清晰性与生产环境鲁棒性。










