pandas datos agregados de dos marcos de datos

Tengo dos marcos de datos de pandas, con algunos índices y algunos nombres de columnas en común (como series de tiempo parcialmente superpuestas relacionadas con cantidades comunes).

Necesito unir estos dos marcos de datos en uno solo que contenga todos los índices y todos los valores de cada índice, manteniendo los valores de la izquierda (derecha) en caso de que aparezca una combinación de índice y columna en ambos marcos de datos.

Los métodos de combinación y combinación no son útiles, ya que el método de combinación duplicará la información que no necesito y la combinación causa el mismo problema.

¿Cuál es un método eficiente para obtener el resultado que necesito?

EDITAR: Si por ejemplo tengo los dos marcos de datos

df1 = pd.DataFrame({ 'C1' : [1.1, 1.2, 1.3], 'C2' : [2.1, 2.2, 2.3], 'C3': [3.1, 3.2, 3.3]}, index=['a', 'b', 'c']) df2 = pd.DataFrame({ 'C3' : [3.1, 3.2, 33.3], 'C4' : [4.1, 4.2, 4.3]}, index=['b', 'c', 'd']) 

Lo que necesito es un método que me permita crear:

 merged = pd.DataFrame({ 'C1': [1.1, 1.2, 1.3, 'nan'], 'C2': [2.1, 2.2, 2.3, 'nan'], 'C3': [3.1, 3.2, 3.3, 33.3], 'C4': ['nan', 4.1, 4.2, 4.3]}, index=['a', 'b', 'c', 'd']) 

Aquí hay tres posibilidades:

  • Use concat/groupby : Primero concatene ambos DataFrames verticalmente. Luego agrupa por el índice y selecciona la primera fila en cada grupo.

  • Use combine_first : Cree un nuevo índice que sea la unión de df1 y df2 . Reindexar df1 usando el nuevo índice. Luego use combine_first para completar los NaN con los valores de df2 .

  • Utilice la construcción manual: podríamos usar df2.index.difference(df1.index) para encontrar exactamente qué filas deben agregarse a df1 . Así que podríamos seleccionar manualmente esas filas de df2 y concatenarlas en df1 .

Para pequeños DataFrames, using_concat es más rápido. Para DataFrames más grandes, using_combine_first parece ser un poco más rápido que las otras opciones:

 import numpy as np import pandas as pd import perfplot def make_dfs(N): df1 = pd.DataFrame(np.random.randint(10, size=(N,2))) df2 = pd.DataFrame(np.random.randint(10, size=(N,2)), index=range(N//2,N//2 + N)) return df1, df2 def using_concat(dfs): df1, df2 = dfs result = pd.concat([df1,df2], sort=False) n = result.index.nlevels return result.groupby(level=range(n)).first() def using_combine_first(dfs): df1, df2 = dfs index = df1.index.union(df2.index) result = df1.reindex(index) result = result.combine_first(df2) return result def using_manual_construction(dfs): df1, df2 = dfs index = df2.index.difference(df1.index) cols = df2.columns.difference(df1.columns) result = pd.concat([df1, df2.loc[index]], sort=False) result.loc[df2.index, cols] = df2 return result perfplot.show( setup=make_dfs, kernels=[using_concat, using_combine_first, using_manual_construction], n_range=[2**k for k in range(5,21)], logx=True, logy=True, xlabel='len(df)') 

introduzca la descripción de la imagen aquí

Sin ver tu código solo puedo dar una respuesta genérica:

Para unir 2 marcos de datos utiliza

 df3 = pd.merge(df1, df2, how='right', on=('col1', 'col2')) 

o

 a.merge(b, how='right', on=('c1', 'c2'))