pandas: fusionar (unir) dos marcos de datos en varias columnas

169

Estoy tratando de unir dos marcos de datos de pandas usando dos columnas:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

pero recibí el siguiente error:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4164)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4028)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120)()

KeyError: '[B_1, c2]'

¿Alguna idea de cuál debería ser la forma correcta de hacer esto? ¡Gracias!

edamame
fuente
53
left_ony right_ondebe ser una lista de cadenas, no una cadena que parezca una lista.
root

Respuestas:

313

Prueba esto

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

left_on: etiqueta o lista, o nombres de campo tipo matriz para unirse en el DataFrame izquierdo. Puede ser un vector o una lista de vectores de la longitud del DataFrame para usar un vector particular como clave de unión en lugar de columnas

right_on: etiqueta o lista, o nombres de campo tipo matriz para unir en el DataFrame derecho o vector / lista de vectores por left_on docs

Shijo
fuente
8
Si left_ony right_onson iguales ay b, ¿podemos usar on = ['a', 'b']?
ahbon
44
Sí, eso es perfectamente válido.
user3065757
4

El problema aquí es que al usar los apóstrofos, está configurando el valor que se pasa como una cadena, cuando, de hecho, como dijo @Shijo en la documentación, la función espera una etiqueta o lista, ¡pero no una cadena! Si la lista contiene cada uno de los nombres de las columnas que los seres pasaron para el marco de datos izquierdo y derecho, entonces cada nombre de columna debe estar individualmente dentro de los apóstrofes. Con lo dicho, podemos entender por qué esto es inccorect:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

Y esta es la forma correcta de usar la función:

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])
Celius Stingher
fuente
3

Otra forma de hacer esto: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

John Ed
fuente