Объединение двух панелей данных, где индексы являются строками - PullRequest
2 голосов
/ 31 января 2020

Вот 2 кадра данных панды, где индексами являются строки:

df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8]], columns=list('AB'))
df.index = ['Tax1','Tax2','Tax1','Tax2']

df2 = pd.DataFrame([[0, 0], [1, 1]], columns=list('AB'))
df2.index = ['Tax3','Tax3']

, что дает для df:

enter image description here

а для df2:

enter image description here

Есть ли простой способ вставить строки df2 в df как таковой:

enter image description here

без необходимости удалять строки индексов обратно в числа и использовать df.loc ['k']? Наиболее близким я был с append, который ставит 2 строки df2 в конце df, а не то, что я ищу ...

1 Ответ

2 голосов
/ 31 января 2020

Вы можете:

  • Добавить индекс верхнего уровня к df ( 1 для первых 2 строк и 2 для последние 2 строки) и сохраните результат, например, в wrk1 .
  • Добавьте индекс верхнего уровня к df2 ( 1 для первой строки и 2 для второй строки) и сохраните результат, например, в wrk2 .
  • Объедините оба вышеуказанных фрейма данных.
  • Сортируйте по MultiIndex и опустите его верхнюю часть level.

Код для этого:

wrk1 = pd.concat([df.iloc[0:2], df.iloc[2:4]], keys=(1, 2))
wrk2 = pd.concat([df2[0:1], df2[1:2]], keys=(1,2))
result = pd.concat([wrk1, wrk2]).sort_index().reset_index(level=0, drop=True)

Подробности, которые следует учитывать: Полученный DataFrame содержит неуникальные записи в индексе, поэтому, возможно, вам следует оставить верхний уровень индекса (на ваш выбор).

Редактировать после вашего вопроса

Давайте посмотрим на промежуточные результаты:

  1. wrk1 - первые 2 строки из df с индексом == 1 и вторые 2 строки с индексом == 2 :

            A  B
    1 Tax1  1  2
      Tax2  3  4
    2 Tax1  5  6
      Tax2  7  8
    
  2. wrk2 - первые строки из df 2 с индексом == 1 и второй строкой с индексом == 2 :

            A  B
    1 Tax3  0  0
    2 Tax3  1  1
    

Один вариант для генерации результат - его «неполная» версия (без reset_index ):

pd.concat([wrk1, wrk2]).sort_index()

Это дает следующий результат:

        A  B
1 Tax1  1  2
  Tax2  3  4
  Tax3  0  0
2 Tax1  5  6
  Tax2  7  8
  Tax3  1  1

Здесь у вас есть 2 уровня индекса:

  • верхний уровень - либо 1 или 2 ,
  • второй уровень - скопировано из исходного источника DataFrames ,

, поэтому на верхнем уровне вы видите «источник» определенных строк (1-го или 2-го подмножества), и каждая строка имеет уникальный индекс.

Второй (полный) параметр:

pd.concat([wrk1, wrk2]).sort_index().reset_index(level=0, drop=True)

, который дает именно то, что вы хотели:

      A  B
Tax1  1  2
Tax2  3  4
Tax3  0  0
Tax1  5  6
Tax2  7  8
Tax3  1  1

(без верхнего уровня мультииндекса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...