Problema de unión de pandas: columnas superpuestas pero sin sufijo especificado

136

Tengo los siguientes 2 marcos de datos:

df_a =

     mukey  DI  PI
0   100000  35  14
1  1000005  44  14
2  1000006  44  14
3  1000007  43  13
4  1000008  43  13

df_b = 
    mukey  niccdcd
0  190236        4
1  190237        6
2  190238        7
3  190239        4
4  190240        7

Cuando intento unirme a estos 2 marcos de datos:

join_df = df_a.join(df_b,on='mukey',how='left')

Me sale el error:

*** ValueError: columns overlap but no suffix specified: Index([u'mukey'], dtype='object')

¿Por qué esto es tan? Los marcos de datos tienen valores comunes de 'mukey'.

usuario308827
fuente

Respuestas:

145

Su error en el fragmento de datos que publicó es un poco críptico, ya que debido a que no hay valores comunes, la operación de unión falla porque los valores no se superponen, requiere que proporcione un sufijo para el lado izquierdo y derecho:

In [173]:

df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
Out[173]:
       mukey_left  DI  PI  mukey_right  niccdcd
index                                          
0          100000  35  14          NaN      NaN
1         1000005  44  14          NaN      NaN
2         1000006  44  14          NaN      NaN
3         1000007  43  13          NaN      NaN
4         1000008  43  13          NaN      NaN

merge funciona porque no tiene esta restricción:

In [176]:

df_a.merge(df_b, on='mukey', how='left')
Out[176]:
     mukey  DI  PI  niccdcd
0   100000  35  14      NaN
1  1000005  44  14      NaN
2  1000006  44  14      NaN
3  1000007  43  13      NaN
4  1000008  43  13      NaN
EdChum
fuente
32

La .join()función está usando el indexconjunto de datos pasado como argumento, por lo que debería usar set_indexo usar la .mergefunción en su lugar.

Encuentre los dos ejemplos que deberían funcionar en su caso:

join_df = LS_sgo.join(MSU_pi.set_index('mukey'), on='mukey', how='left')

o

join_df = df_a.merge(df_b, on='mukey', how='left')
Velizar VESSELINOV
fuente
27

Este error indica que las dos tablas tienen 1 o más nombres de columna que tienen el mismo nombre de columna. El mensaje de error se traduce como: "Puedo ver la misma columna en ambas tablas, pero tampoco me ha dicho que cambie el nombre antes de traer una de ellas"

Desea eliminar una de las columnas antes de traerla de la otra al usar del df ['nombre de columna'], o usar lsuffix para reescribir la columna original, o rsuffix para cambiar el nombre de la que se está trayendo.

df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
usuario1761806
fuente
1

Principalmente join se usa exclusivamente para unirse en función del índice, no de los nombres de los atributos, por lo que cambie los nombres de los atributos en dos marcos de datos diferentes, luego intente unirse, se unirán, de lo contrario, se genera este error

usuario12690524
fuente