Слияние фреймов данных по индексу с пандами

У меня есть два кадра данных, и у каждого есть два столбца индекса. Я хотел бы объединить их. Например, первый кадр данных выглядит следующим образом:

                   V1

A      1/1/2012    12
       2/1/2012    14
B      1/1/2012    15
       2/1/2012    8
C      1/1/2012    17
       2/1/2012    9

Второй кадр данных выглядит следующим образом:

                   V2

A      1/1/2012    15
       3/1/2012    21             
B      1/1/2012    24
       2/1/2012    9
D      1/1/2012    7
       2/1/2012    16

и в результате я хотел бы получить следующее:

                   V1   V2

A      1/1/2012    12   15
       2/1/2012    14   N/A
       3/1/2012    N/A  21           
B      1/1/2012    15   24
       2/1/2012    8    9
C      1/1/2012    7    N/A
       2/1/2012    16   N/A
D      1/1/2012    N/A  7
       2/1/2012    N/A  16

Я пробовал несколько версий с использованием методов pd.merge и .join, но, похоже, ничего не работает. У вас есть какие-нибудь предложения?

Ответ 1

Вы должны иметь возможность использовать join, который по умолчанию присоединяется к индексу. Учитывая желаемый результат, вы должны использовать outer как тип соединения.

>>> df1.join(df2, how='outer')
            V1  V2
A 1/1/2012  12  15
  2/1/2012  14 NaN
  3/1/2012 NaN  21
B 1/1/2012  15  24
  2/1/2012   8   9
C 1/1/2012  17 NaN
  2/1/2012   9 NaN
D 1/1/2012 NaN   7
  2/1/2012 NaN  16

Подпись: _.join(other, on = None, how = 'left', lsuffix = '', rsuffix = '', sort = False) строка документации: Объединение столбцов с другим DataFrame либо по индексу, либо по ключу колонка. Эффективно Присоединяйте несколько объектов DataFrame по индексу за раз передача списка.

Ответ 2

Вы можете сделать это с помощью merge:

df_merged = df1.merge(df2, how='outer', left_index=True, right_index=True)

Аргумент ключевого слова how='outer' хранит все индексы из обоих фреймов, заполняя отсутствующие индексы с помощью NaN. Аргументы left_index и right_index имеют слияние с индексами. Если вы получите все NaN в столбце после выполнения слияния, другим шагом по устранению неполадок является проверка того, что ваши индексы имеют одинаковый dtypes.

Приведенный выше код merge создает для меня следующий вывод:

                V1    V2
A 2012-01-01  12.0  15.0
  2012-02-01  14.0   NaN
  2012-03-01   NaN  21.0
B 2012-01-01  15.0  24.0
  2012-02-01   8.0   9.0
C 2012-01-01  17.0   NaN
  2012-02-01   9.0   NaN
D 2012-01-01   NaN   7.0
  2012-02-01   NaN  16.0