Cómo mantener el índice al usar pandas merge
Me gustaría fusionar dos DataFrames
y 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
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 a
cuando hay varias coincidencias entre a
y b
. En este caso, es posible que tengas que eliminar duplicados .
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).
Existe una solución que no es pd.merge y usa Series.map
y 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 index
nombre ficticio para el índice.
Sin embargo, tenga en cuenta que no existe ningún DataFrame.map
método, por lo que este enfoque no es para varias columnas.