Во-первых, простой случай.Предполагая, что и заголовки, и индексы являются монотонно числовыми, вы можете просто изменить индексаторы y
как смещения от x
:
y.index += x.index[-1] + 1
y.columns += x.columns[-1] + 1
pd.concat([x, y])
0 1 2 3 4
0 1.0 2.0 NaN NaN NaN
1 3.0 4.0 NaN NaN NaN
2 NaN NaN 5 6 7
3 NaN NaN 8 9 X
4 NaN NaN Y Z 0
Теперь, чтобы обобщить это для нескольких DataFrames, мы повторяем цикл:
df_list = [x, y]
offset_x = offset_y = 0
for df in df_list:
df.index = np.arange(len(df)) + offset_x
df.columns = np.arange(len(df.columns)) + offset_y
offset_x += df.index[-1] + 1
offset_y += df.columns[-1] + 1
pd.concat(df_list)
0 1 2 3 4
0 1.0 2.0 NaN NaN NaN
1 3.0 4.0 NaN NaN NaN
2 NaN NaN 5 6 7
3 NaN NaN 8 9 X
4 NaN NaN Y Z 0
Если ваш индекс / столбцы не монотонно увеличиваются, я настоятельно рекомендую сбросить их перед объединением, или посмотрите на вариант ниже.
Если вы в порядкес 0 вместо NaN, вы можете использовать scipy
block_diag
без необходимости изменять индексы или столбцы:
from scipy.linalg import block_diag
pd.DataFrame(block_diag(*df_list))
0 1 2 3 4
0 1 2 0 0 0
1 3 4 0 0 0
2 0 0 5 6 7
3 0 0 8 9 X
4 0 0 Y Z 0
Кредит этот ответ для этого решения.