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

Resuelto Edamame asked hace 7 años • 6 respuestas

Estoy intentando 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 obtuve 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?

Edamame avatar Jan 24 '17 03:01 Edamame
Aceptado

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 campos similares a una matriz para unirse en el marco de datos 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 campos tipo matriz para unir en el marco de datos derecho o vector/lista de vectores por documentos left_on

Shijo avatar Jan 23 '2017 20:01 Shijo
  1. Se fusiona según el orden de left_ony right_on, es decir, el i-ésimo elemento de left_oncoincidirá con el i-ésimo de right_on.

    En el siguiente ejemplo, el código de arriba coincide A_col1con B_col1y A_col2con B_col2, mientras que el código de abajo coincide A_col1con B_col2y A_col2con B_col1. Evidentemente, los resultados son diferentes.

    res1

  2. Como se puede ver en el ejemplo anterior, si las claves de combinación tienen nombres diferentes, todas las claves se mostrarán como sus columnas individuales en el marco de datos combinado. En el ejemplo anterior, en el marco de datos superior, A_col1y B_col1son idénticos y A_col2y B_col2son idénticos. En el marco de datos inferior, A_col1y B_col2son idénticos y A_col2y B_col1son idénticos. Como se trata de columnas duplicadas, lo más probable es que no sean necesarias. Una forma de no tener este problema desde el principio es hacer que las claves de combinación sean idénticas desde el principio. Consulte el punto 3 a continuación.

  3. Si left_ony right_onson iguales col1y col2, podemos usar on=['col1', 'col2']. En este caso, no se duplican claves de combinación.

    df1.merge(df2, on=['col1', 'col2'])
    

    res3

  4. También puede fusionar un lado de los nombres de las columnas y el otro lado del índice también. Por ejemplo, en el siguiente ejemplo, df1las columnas de 'se comparan con df2los índices de'. Si los índices tienen nombre, como en el ejemplo siguiente, puede hacer referencia a ellos por nombre, pero si no, también puede usarlos right_index=True(o left_index=Truesi el marco de datos izquierdo es el que se está fusionando en el índice).

    df1.merge(df2, left_on=['A_col1', 'A_col2'], right_index=True)
    # or
    df1.merge(df2, left_on=['A_col1', 'A_col2'], right_on=['B_col1', 'B_col2'])
    

    res3

  5. Al utilizar el parámetro, también how=puede realizar LEFT JOIN( how='left'), FULL OUTER JOIN( how='outer') y RIGHT JOIN( ). how='right'El valor predeterminado es INNER JOIN( how='inner') como en los ejemplos anteriores.

  6. Si tiene más de 2 marcos de datos para fusionar y las claves de combinación son las mismas en todos ellos, entonces joinel método es más eficiente mergeporque puede pasar una lista de marcos de datos y unir índices. Tenga en cuenta que los nombres de los índices son los mismos en todos los marcos de datos en el siguiente ejemplo ( col1y col2). Tenga en cuenta que los índices no tienen por qué tener nombres; Si los índices no tienen nombres, entonces el número de índices múltiples debe coincidir (en el caso siguiente hay 2 índices múltiples). Nuevamente, como en el punto 1, la coincidencia se produce según el orden de los índices.

    df1.join([df2, df3], how='inner').reset_index()
    

    res4

cottontail avatar Jan 20 '2023 22:01 cottontail

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 avatar Sep 11 '2019 22:09 john ed

Puede utilizarlo a continuación, que es breve y sencillo de entender:

merged_data= df1.merge(df2, on=["column1","column2"])
Ali karimi avatar Feb 03 '2022 16:02 Ali karimi

el problema aquí es que al usar los apóstrofes estás configurando el valor que se pasa como una cadena, cuando en realidad, como @Shijo indicó 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 pasadas para el marco de datos izquierdo y derecho, entonces cada nombre de columna debe estar individualmente entre apóstrofos. Con lo dicho, podemos entender por qué esto es incorrecto:

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 avatar Sep 05 '2019 18:09 Celius Stingher