Как объединить несколько фреймов данных в один с чередованием столбцов?

Есть три фрейма данных:

 id A_1 A_2    id B_1 B_2    id C_1 C_2
 0  a1  a2     0  b1  b2     0  c1  c2
 1  a3  a4     1  b3  b4     1  c3  c4

Как я могу объединить их в один, чередуя колонки, чтобы получить:

id A_1 B_1 C_1 A_2 B_2 C_2
0  a1  b1  c1  a2  b2  c2
1  a3  b3  c3  a4  b4  c4

Ответы (2 шт):

Автор решения: strawdog

Если у вас исходные датафреймы, например df1, df2 ,df3, то:

res = df1.copy() # создаем копию исходного фрейма, чтобы не вносить в него изменений
res = res.join([df2, df3])
res = res.reindex(sorted(res.columns, key=lambda x: int(x.split('_')[1])), axis=1)

тогда res у вас будет:

  A_1 B_1 C_1  A_2  B_2  C_2
0  a1  b1  c1  a_2  b_2  c_2
1  a3  b3  c3  a_4  b_4  c_4
→ Ссылка
Автор решения: MaxU

@strawdog уже показал вариант решения для случая, когда наименования столбцов исходных фреймов позволяют остортировать их таким образом, чтобы получилась правильная последовательность. К сожалению, в реальной жизни это встречается не так часто, поэтому в этом ответе я хочу показать решение, которое будет работать с любыми наименованиями столбцов:

Исходные фреймы / таблицы:

In [21]: df1
Out[21]:
    a   b
0  a1  a2
1  a3  a4

In [22]: df2
Out[22]:
    c   d
0  b1  b2
1  b3  b4

In [23]: df3
Out[23]:
    e   f
0  c1  c2
1  c3  c4

Решение:

res = pd.concat([df1, df2, df3], axis=1)[np.ravel(list(zip(df1, df2, df3)))]

Результат:

In [25]: res
Out[25]:
    a   c   e   b   d   f
0  a1  b1  c1  a2  b2  c2
1  a3  b3  c3  a4  b4  c4
→ Ссылка