Как объединить несколько фреймов данных в один с чередованием столбцов?
Есть три фрейма данных:
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