Объединить 2 идентичных фрейма данных pandas в многоуровневый ключ строки

#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'])) , который в некоторой степени получил тот же результат.