Problema de unión de pandas: las columnas se superponen pero no se especifica el sufijo

3 minutos de lectura

avatar de usuario
usuario308827

Tengo los siguientes marcos de datos:

print(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

print(df_b)
    mukey  niccdcd
0  190236        4
1  190237        6
2  190238        7
3  190239        4
4  190240        7

Cuando trato de unir estos 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 en común 'mukey' valores.

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

avatar de usuario
Velizar VESSELINOV

los .join() función está usando el index del conjunto de datos pasado como argumento, por lo que debe usar set_index o usar .merge funció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')

  • me gustaria agregar eso set_index tiene que ser aplicado en ambos lados y luego mejora el rendimiento considerablemente sobre merge.

    – mirekphd

    14 dic 2021 a las 19:01

avatar de usuario
chispa roja

Este error indica que las dos tablas tienen uno 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 no me ha dicho que cambie el nombre de ninguna de ellas antes de incluirlas en la misma tabla”.

O desea eliminar una de las columnas antes de traerla de la otra al usar del df['column name']o usar lsuffix para volver a escribir la columna original, o rsuffix para renombrar el que se está trayendo.

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

El error indica que las dos tablas tienen 1 o más nombres de columna que tienen el mismo nombre de columna.

Cualquier persona con el mismo error que no quiera proporcionar un sufijo puede cambiar el nombre de las columnas. También asegúrese de que el índice de ambos DataFrames coincida en tipo y valor si no desea proporcionar el on='mukey' ajuste.

# rename example
df_a = df_a.rename(columns={'a_old': 'a_new', 'a2_old': 'a2_new'})
# set the index
df_a = df_a.set_index(['mukus'])
df_b = df_b.set_index(['mukus'])

df_a.join(df_b)

Principalmente, la unión se usa exclusivamente para unirse según el índice, no en los nombres de los atributos, así que cambie los nombres de los atributos en dos marcos de datos diferentes, luego intente unirse, se unirán, de lo contrario, se generará este error.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad