Me gustaría fusionar dos DataFrames
y mantener el índice del primer fotograma como índice en el conjunto de datos combinado. 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: se cambió al código de ejemplo que se puede reproducir fácilmente
Respuestas:
Nota: para algunas operaciones de combinación izquierda, puede terminar con más filas si hay varias coincidencias entre
a
y,b
y deberá deduplicar ( documentación para la deduplicación ). Es por eso que pandas no guarda el índice por ti.fuente
a
marco original . reset_index mueve el índice a una columna normal y set_index de esta columna después de la fusión también se ocupa cuando las filas de a se duplican / eliminan debido a la operación de fusión.a.reset_index().merge(b, how="left").set_index(a.index.names)
.Puede hacer una copia del índice en el marco de datos izquierdo y fusionar.
Encontré este método simple muy útil al trabajar con marcos de datos grandes y usar
pd.merge_asof()
(odd.merge_asof()
).Este enfoque sería superior cuando restablecer el índice es costoso (marco de datos grande).
fuente
Hay una solución que no es pd.merge. Usando
map
yset_index
Y no introduce un
index
nombre ficticio para el índice.fuente
pd.Dataframe
y no unpd.Series
. El.map()
método solo está definido parapd.Series
. Esto significa que:a[['to_merge_on_1', 'to_merge_on_2']].map(...)
no funcionará.Esto permite preservar el índice de df1
fuente
on=list_of_cols]
, contradice la documentación:If joining columns on columns, the DataFrame indexes *will be ignored*
. ¿Tiene prioridad el uso de índices frente a columnas?Creo que se me ocurrió una solución diferente. Me estaba uniendo a la tabla de la izquierda en el valor del índice y la tabla de la derecha en un valor de columna basado en el índice de la tabla de la izquierda. Lo que hice fue una fusión normal:
Luego recuperé los nuevos números de índice de la tabla combinada y los puse en una nueva columna llamada Número de línea de opinión:
Luego, volví a establecer manualmente el índice en el índice de la tabla izquierda original en función de la columna preexistente llamada Número de línea (el valor de columna al que me uní desde el índice de la tabla izquierda):
Luego eliminó el nombre de índice del Número de línea para que quede en blanco:
Tal vez sea un truco, pero parece funcionar bien y relativamente simple. Además, suponga que reduce el riesgo de duplicados / alterar sus datos. Ojalá todo tenga sentido.
fuente
otra opción simple es cambiar el nombre del índice a lo que era antes:
fusionar conserva el orden en el marco de datos 'a', pero simplemente restablece el índice para que se guarde para usar set_axis
fuente