2012-08-15 24 views
54

Me gustaría fusionar dos DataFrames, y mantener el índice del primer fotograma como el índice en el conjunto de datos combinado. Sin embargo, cuando realizo la fusión, el DataFrame resultante tiene un índice entero. ¿Cómo puedo especificar que deseo mantener el índice del marco de datos izquierdo?Cómo mantener el índice al usar pandas fusionar

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: Switched a ejemplo de código que puede ser reproducida fácilmente

+29

Esto tiene que estar en el top 10 de las cosas más tontas sobre los pandas ... ... ¿por qué la pérdida del índice tendría alguna vez sentido? – Corone

Respuesta

69
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 
+1

Muy inteligente. a.merge (b, how = "left"). set_index (a.index) también funciona, pero parece menos robusto (ya que la primera parte pierde los valores de índice a a antes de restablecerlos). – DanB

+7

Para este particular caso, esos son equivalentes. Pero para muchas operaciones de fusión, el marco resultante no tiene el mismo número de filas que el marco 'a' original. reset_index mueve el índice a una columna regular y set_index desde esta columna después de que la fusión también se ocupa cuando las filas de a se duplican/eliminan debido a la operación de fusión. –

+0

No sabía por qué se descompondría mi solución, pero pensé que sí. La solución reset_index() y luego set_index() tiene mucho sentido. Gracias. – DanB

1

Hay una solución no pd.merge. Usando map y 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 

Y, no introduce un nombre ficticio index para el índice.

Cuestiones relacionadas