Подтвердить что ты не робот

Как сохранить индекс при использовании pandas merge

Я хотел бы объединить два DataFrames и сохранить индекс из первого фрейма в качестве индекса в объединенном наборе данных. Однако, когда я делаю слияние, полученный DataFrame имеет целочисленный индекс. Как я могу указать, что я хочу сохранить индекс из левого фрейма данных?

In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3}, 
                          'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})

In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3}, 
                          'to_merge_on': {0: 1, 1: 3, 2: 5}})

In [6]: a
Out[6]:
   col1  to_merge_on
a     1            1
b     2            3
c     3            4

In [7]: b
Out[7]:
   col2  to_merge_on
0     1            1
1     2            3
2     3            5

In [8]: a.merge(b, how='left')
Out[8]:
   col1  to_merge_on  col2
0     1            1   1.0
1     2            3   2.0
2     3            4   NaN

In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')

EDIT: переключается на пример кода, который можно легко воспроизвести

4b9b3361

Ответ 1

In [5]: a.reset_index().merge(b, how="left").set_index('index')
Out[5]:
       col1  to_merge_on  col2
index
a         1            1     1
b         2            3     2
c         3            4   NaN

Примечание: для некоторых операций слияния слева вы можете получить больше строк, если между a и b имеется несколько совпадений, и вам потребуется дедупликация (документация для дедупликации). Вот почему панды не хранят индекс для вас.

Ответ 2

Существует не-pd.merge решение. Используя map и set_index

In [1744]: a.assign(col2=a['to_merge_on'].map(b.set_index('to_merge_on')['col2']))
Out[1744]:
   col1  to_merge_on  col2
a     1            1   1.0
b     2            3   2.0
c     3            4   NaN

И не вводит фиктивное имя index для индекса.

Ответ 3

df1 = df1.merge(
        df2, how="inner", left_index=True, right_index=True
    )

Это позволяет сохранить индекс df1

Ответ 4

Вы можете сделать копию индекса на левом фрейме данных и выполнить слияние.

a['copy_index'] = a.index
a.merge(b, how='left')

Я нашел этот простой метод очень полезным при работе с большим фреймом данных и использовании pd.merge_asof() (или dd.merge_asof()).

Объединение двух фреймов данных с индексом является эффективным, а сброс индекса является дорогостоящим в настройке больших фреймов данных.