Di dos tramas de datos:
df1 = pd.DataFrame({'A': ['foo', 'bar', 'test'], 'b': [1, 2, 3], 'c': [3, 4, 5]}) df2 = pd.DataFrame({'A': ['foo', 'baz'], 'c': [2, 1]}) df1 A bc 0 foo 1 3 1 bar 2 4 2 test 3 5 df2 A c 0 foo 2 1 baz 1Después de fusionar quiero:
df1 A bc 0 foo 1 3 1 bar 2 4 2 test 3 5 3 baz NaN 1 Si df1['A'] no contiene nada de df2['A'] , solo se deben agregar las filas de df2 a df1 . Ignore otras columnas cuando haya una coincidencia en la columna A
pd.merge(df1, df2, on=['A'], how='outer') , pero esto no da el resultado esperado.
Además, para referencia futura, también quiero saber cómo obtener el siguiente resultado:
df1 A bc 0 foo 1 2 1 bar 2 4 2 test 3 5 3 baz NaN 1 Vea el valor col c actualizado de df2 para foo .
Prueba con combine_first
out = df1.set_index('A').combine_first(df2.set_index('A')).reset_index() A bc 0 bar 2.0 4 1 baz NaN 1 2 foo 1.0 3 3 test 3.0 5Está en el camino correcto, debe completar c con valores del otro marco de datos:
(df1.merge(df2.rename(columns={'c': 'c_y'}), on='A', how = 'outer') .assign(c = lambda df: df.c.fillna(df.c_y)) .drop(columns = 'c_y') ) A bc 0 foo 1.0 3.0 1 bar 2.0 4.0 2 test 3.0 5.0 3 baz NaN 1.0Puede usar Series.isin para verificar si los valores df1['A'] están en df2['A'] que una serie booleana usa en la indexación booleana. Luego use DataFrame.append .
m = df2['A'].isin(df1['A']) out = df1.append(df2[~m], ignore_index=True) print(out) # A bc # 0 foo 1.0 3 # 1 bar 2.0 4 # 2 test 3.0 5 # 3 baz NaN 1