Fusionar dos marcos de datos por índice

Resuelto brucezepplin asked hace 8 años • 7 respuestas

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 fusiono 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 tengo entendido que, es merge()decir, df1.merge(df2)utiliza columnas para hacer la comparación. De hecho, al hacer esto obtengo:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  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"?

brucezepplin avatar Nov 07 '16 21:11 brucezepplin
Aceptado

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

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

O join, que es una unión izquierda por defecto:

df1.join(df2)

O concat, que es una 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)
   a  b
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)
   c   d
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)
   a  b  c   d
a  0  5  0  10
b  1  3  1  20

# Default left join
df4 = df1.join(df2)
print (df4)
   a  b    c     d
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)
     a    b    c     d
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
jezrael avatar Nov 07 '2016 14:11 jezrael

Puede utilizar 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)
MaxU - stand with Ukraine avatar Nov 07 '2016 14:11 MaxU - stand with Ukraine

Esta respuesta se resolvió por un tiempo y todas las opciones disponibles ya están disponibles. Sin embargo, en esta respuesta intentaré arrojar un poco más de luz sobre estas opciones para ayudarle a comprender cuándo usar qué.

Esta publicación abordará los siguientes temas:

  • Fusionarse con el índice en diferentes condiciones
    • opciones para uniones basadas en índices: merge, join,concat
    • fusionándose en índices
    • fusionándose en el índice de uno, columna de otro
  • uso eficaz de índices con nombre para simplificar la sintaxis de fusión

Uniones basadas en índices

TL;DR

Hay algunas opciones, algunas más simples que otras según el caso de uso.

  1. DataFrame.mergecon left_indexy right_index(o left_ony right_onusando índices con nombre)
  2. DataFrame.join(se une al índice)
  3. pd.concat(se une al índice)
PROS CONTRAS
merge

• admite uniones interior/izquierda/derecha/completa
• admite uniones columna-columna, índice-columna, índice-índice

• sólo puede unir dos fotogramas a la vez

join

• admite interior/izquierdo (predeterminado)/derecho/completo
• puede unir múltiples DataFrames a la vez

• sólo admite uniones índice-índice

concat

• se especializa en unir múltiples DataFrames a la vez
• muy rápido (la concatenación es en tiempo lineal)

• solo admite uniones internas/completas (predeterminadas)
• solo admite uniones índice-índice


Uniones de índice a índice

Normalmente, una unión interna en un índice tendría este aspecto:

left.merge(right, left_index=True, right_index=True)

Otros tipos de uniones (izquierda, derecha, exterior) siguen una sintaxis similar (y se pueden controlar mediante how=...).

Alternativas notables

  1. DataFrame.joinEl valor predeterminado es una unión externa izquierda en el índice.

     left.join(right, how='inner',)
    

    Si obtiene ValueError: columns overlap but no suffix specified, deberá especificar lsuffixargumentos rsuffix=para resolverlo. Dado que los nombres de las columnas son los mismos, se requiere un sufijo diferenciador.

  2. pd.concatse une al índice y puede unir dos o más DataFrames a la vez. Realiza una unión externa completa de forma predeterminada.

     pd.concat([left, right], axis=1, sort=False)
    

    Para obtener más información sobre concat, consulte esta publicación .


Índice de uniones de columnas

Para realizar una unión interna usando el índice de la izquierda y la columna de la derecha, usará DataFrame.mergeuna combinación de left_index=Truey right_on=....

left.merge(right, left_index=True, right_on='key')

Otras uniones siguen una estructura similar. Tenga en cuenta que solo merge se pueden realizar uniones de índice a columna. Puede unirse en varios niveles/columnas, siempre que el número de niveles de índice de la izquierda sea igual al número de columnas de la derecha.

joiny concatno son capaces de realizar fusiones mixtas. Deberá configurar el índice como paso previo usando DataFrame.set_index.


Esta publicación es una versión abreviada de mi trabajo en Pandas Merging 101 . Siga este enlace para obtener más ejemplos y otros temas sobre la fusión.

cs95 avatar Dec 23 '2020 11:12 cs95