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)