Fusionar dos cuadros de datos por índice

Hola tengo los siguientes marcos de datos:

> df1 id begin conditional confidence discoveryTechnique 0 278 56 false 0.0 1 1 421 18 false 0.0 1 > df2 concept 0 A 1 B 

¿Cómo me fusiono en los índices para obtener:

  id begin conditional confidence discoveryTechnique concept 0 278 56 false 0.0 1 A 1 421 18 false 0.0 1 B 

Lo pregunto porque entiendo que merge() es decir, df1.merge(df2) usa columnas para hacer la comparación. De hecho, haciendo esto me sale:

 Traceback (most recent call last): File "", line 1, in  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge copy=copy, indicator=indicator) File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge copy=copy, indicator=indicator) File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__ self._validate_specification() File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification raise MergeError('No common columns to perform merge on') pandas.tools.merge.MergeError: No common columns to perform merge on 

¿Es una mala práctica fusionarse en el índice? ¿Es imposible? Si es así, ¿cómo puedo cambiar el índice a una nueva columna llamada “índice”?

Gracias

Use merge , que es una unión interna por defecto:

 pd.merge(df1, df2, left_index=True, right_index=True) 

O join , que se deja unido por defecto:

 df1.join(df2) 

O concat , que es la unión externa por defecto:

 pd.concat([df1, df2], axis=1) 

Muestras :

 df1 = pd.DataFrame({'a':range(6), 'b':[5,3,6,9,2,4]}, index=list('abcdef')) print (df1) ab a 0 5 b 1 3 c 2 6 d 3 9 e 4 2 f 5 4 df2 = pd.DataFrame({'c':range(4), 'd':[10,20,30, 40]}, index=list('abhi')) print (df2) cd a 0 10 b 1 20 h 2 30 i 3 40 

 #default inner join df3 = pd.merge(df1, df2, left_index=True, right_index=True) print (df3) abcd a 0 5 0 10 b 1 3 1 20 #default left join df4 = df1.join(df2) print (df4) abcd a 0 5 0.0 10.0 b 1 3 1.0 20.0 c 2 6 NaN NaN d 3 9 NaN NaN e 4 2 NaN NaN f 5 4 NaN NaN #default outer join df5 = pd.concat([df1, df2], axis=1) print (df5) abcd a 0.0 5.0 0.0 10.0 b 1.0 3.0 1.0 20.0 c 2.0 6.0 NaN NaN d 3.0 9.0 NaN NaN e 4.0 2.0 NaN NaN f 5.0 4.0 NaN NaN h NaN NaN 2.0 30.0 i NaN NaN 3.0 40.0 

puede usar concat ([df1, df2, …], axis = 1) para concatenar dos o más DF alineados por índices:

 pd.concat([df1, df2, df3, ...], axis=1) 

o fusionar para concatenar por campos / índices personalizados:

 # join by _common_ columns: `col1`, `col3` pd.merge(df1, df2, on=['col1','col3']) # join by: `df1.col1 == df2.index` pd.merge(df1, df2, left_on='col1' right_index=True) 

o unirse para unirse por índice:

  df1.join(df2) 

Un error tonto que me atrapó: las uniones fallaron porque los tipos de índice diferían. Esto no era obvio ya que ambas tablas eran tablas dinámicas de la misma tabla original. Después de reset_index, los índices parecían idénticos en jupyter. Solo salió a la luz al guardar para excel …

Corregido con: df1[['key']] = df1[['key']].apply(pd.to_numeric)

Esperemos que esto salve a alguien una hora!

Si desea unir dos marcos de datos en pandas, simplemente puede usar los atributos disponibles como merge o concatenate . Por ejemplo, si tengo dos marcos de datos df1 y df2 , puedo unirlos mediante:

 newdataframe=merge(df1,df2,left_index=True,right_index=True)