pandas: fusionar (unir) dos marcos de datos en varias columnas
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?
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
Se fusiona según el orden de
left_on
yright_on
, es decir, el i-ésimo elemento deleft_on
coincidirá con el i-ésimo deright_on
.En el siguiente ejemplo, el código de arriba coincide
A_col1
conB_col1
yA_col2
conB_col2
, mientras que el código de abajo coincideA_col1
conB_col2
yA_col2
conB_col1
. Evidentemente, los resultados son diferentes.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_col1
yB_col1
son idénticos yA_col2
yB_col2
son idénticos. En el marco de datos inferior,A_col1
yB_col2
son idénticos yA_col2
yB_col1
son 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.Si
left_on
yright_on
son igualescol1
ycol2
, podemos usaron=['col1', 'col2']
. En este caso, no se duplican claves de combinación.df1.merge(df2, on=['col1', 'col2'])
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,
df1
las columnas de 'se comparan condf2
los í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 usarlosright_index=True
(oleft_index=True
si 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'])
Al utilizar el parámetro, también
how=
puede realizarLEFT JOIN
(how='left'
),FULL OUTER JOIN
(how='outer'
) yRIGHT JOIN
( ).how='right'
El valor predeterminado esINNER JOIN
(how='inner'
) como en los ejemplos anteriores.Si tiene más de 2 marcos de datos para fusionar y las claves de combinación son las mismas en todos ellos, entonces
join
el método es más eficientemerge
porque 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 (col1
ycol2
). 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()
Otra forma de hacer esto:
new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')
Puede utilizarlo a continuación, que es breve y sencillo de entender:
merged_data= df1.merge(df2, on=["column1","column2"])
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'])