#python #pandas #dataframe #concatenation #concat
#python #pandas #фрейм данных #конкатенация
Вопрос:
У меня есть 2 фрейма данных с одинаковым индексом и столбцом. Мне нужно объединить или объединить их в один фрейм данных. Код для генерации данных как таковой:
import pandas as pd
sites = pd.Index(['AAA', 'BBB','CCC', 'DDD'], name='SITELIST')
vvv = pd.DataFrame({'KK':[1,2,3,4],'GG':[2,3,4,5], 'RR':[6,5,4,3]}, index = sites)
ttt = pd.DataFrame({'KK':[11,22,33,34],'GG':[23,33,34,35], 'RR':[26,25,24,23]}, index = sites)
Результирующий фрейм данных
print(vvv)
KK GG RR
SITELIST
AAA 1 2 6
BBB 2 3 5
CCC 3 4 4
DDD 4 5 3
print(ttt)
KK GG RR
SITELIST
AAA 11 23 26
BBB 22 33 25
CCC 33 34 24
DDD 34 35 23
Когда я использую concat для объединения этих двух фреймов данных со следующим кодом:
res2 = pd.concat([vvv, ttt], axis=0, keys=["VVV", "TTT"], names=['Sensor', 'Site'])
Я получаю это в результате:
print(res2)
KK GG RR
Sensor Site
VVV AAA 1 2 6
BBB 2 3 5
CCC 3 4 4
DDD 4 5 3
TTT AAA 11 23 26
BBB 22 33 25
CCC 33 34 24
DDD 34 35 23
Мне нужно присоединиться к ним, чтобы получить такой результат, как:
KK GG RR
Site Sensor
AAA VVV 1 2 6
TTT 11 23 26
BBB VVV 2 3 5
TTT 22 33 25
CCC VVV 3 4 4
TTT 33 34 24
DDD VVV 4 5 3
TTT 34 35 23
Спасибо.
Комментарии:
1. Похоже, ваша проблема связана с порядком строк: вы можете просто отсортировать по столбцу «Сайт» следующим образом:
df.sort_values('Site')
2. Добавить
.reorder_levels([1, 0])
.
Ответ №1:
Вы можете использовать df.swaplevel
с df.sort_index
и reindex
:
print(res2.swaplevel().sort_index(level=0).reindex(['VVV','TTT'],level=1))
KK GG RR
Site Sensor
AAA VVV 1 2 6
TTT 11 23 26
BBB VVV 2 3 5
TTT 22 33 25
CCC VVV 3 4 4
TTT 33 34 24
DDD VVV 4 5 3
TTT 34 35 23
Комментарии:
1. От @Rocco я также получил
print(res2.sort_values('Site').reset_index(level=['Site','Sensor']).set_index(['Site', 'Sensor']))
, который в некоторой степени получил тот же результат.