Cómo mantener el índice al usar pandas merge

Resuelto DanB asked hace 12 años • 10 respuestas

Me gustaría fusionar dos DataFramesy mantener el índice del primer fotograma como índice en el conjunto de datos fusionado. Sin embargo, cuando hago la fusión, el DataFrame resultante tiene un índice entero. ¿Cómo puedo especificar que quiero mantener el índice del marco de datos izquierdo?

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')

EDITAR: Cambiado a código de ejemplo que se puede reproducir fácilmente

DanB avatar Aug 16 '12 03:08 DanB
Aceptado
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

Tenga en cuenta que para algunas operaciones de fusión por la izquierda, puede terminar con más filas que acuando hay varias coincidencias entre ay b. En este caso, es posible que tengas que eliminar duplicados .

Wouter Overmeire avatar Aug 16 '2012 07:08 Wouter Overmeire

Puede hacer una copia del índice en el marco de datos izquierdo y fusionarlo.

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

Encontré este método simple muy útil mientras trabajaba con marcos de datos grandes y usaba pd.merge_asof()(o dd.merge_asof()).

Este enfoque sería superior cuando restablecer el índice es costoso (marco de datos grande).

Matthew Son avatar Jul 27 '2019 21:07 Matthew Son

Existe una solución que no es pd.merge y usa Series.mapy DataFrame.set_index.

a['col2'] = a['to_merge_on'].map(b.set_index('to_merge_on')['col2']))

   col1  to_merge_on  col2
a     1            1   1.0
b     2            3   2.0
c     3            4   NaN

Esto no introduce un indexnombre ficticio para el índice.

Sin embargo, tenga en cuenta que no existe ningún DataFrame.mapmétodo, por lo que este enfoque no es para varias columnas.

Zero avatar Sep 11 '2017 17:09 Zero