2012-03-20 20 views
20

Quiero realizar una operación join/merge/append en un dataframe con índice datetime.join or merge with overwrite in pandas

Digamos que tengo df1 y quiero agregar df2 a él. df2 puede tener menos o más columnas e índices superpuestos. Para todas las filas donde los índices coinciden, si df2 tiene la misma columna que df1, quiero que los valores de df1 se sobrescriban con los de df2.

¿Cómo puedo obtener el resultado deseado?

Respuesta

22

Qué tal: df2.combine_first(df1)?

In [33]: df2 
Out[33]: 
        A   B   C   D 
2000-01-03 0.638998 1.277361 0.193649 0.345063 
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726 
2000-01-05 0.435507 -0.025162 -1.112890 0.324111 
2000-01-06 -0.210756 -1.027164 0.036664 0.884715 
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341 
2000-01-10 1.015447 -0.909930 0.027548 0.258471 
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598 

In [34]: df1 
Out[34]: 
        A   B   C 
2000-01-03 2.288863 0.188175 -0.040928 
2000-01-04 0.159107 -0.666861 -0.551628 
2000-01-05 -0.356838 -0.231036 -1.211446 
2000-01-06 -0.866475 1.113018 -0.001483 
2000-01-07 0.303269 0.021034 0.471715 
2000-01-10 1.149815 0.686696 -1.230991 
2000-01-11 -1.296118 -0.172950 -0.603887 
2000-01-12 -1.034574 -0.523238 0.626968 
2000-01-13 -0.193280 1.857499 -0.046383 
2000-01-14 -1.043492 -0.820525 0.868685 

In [35]: df2.comb 
df2.combine  df2.combineAdd  df2.combine_first df2.combineMult  

In [35]: df2.combine_first(df1) 
Out[35]: 
        A   B   C   D 
2000-01-03 0.638998 1.277361 0.193649 0.345063 
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726 
2000-01-05 0.435507 -0.025162 -1.112890 0.324111 
2000-01-06 -0.210756 -1.027164 0.036664 0.884715 
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341 
2000-01-10 1.015447 -0.909930 0.027548 0.258471 
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598 
2000-01-12 -1.034574 -0.523238 0.626968  NaN 
2000-01-13 -0.193280 1.857499 -0.046383  NaN 
2000-01-14 -1.043492 -0.820525 0.868685  NaN 

Nota que toma los valores de los índices df1 para que no se superpongan con df2. Si esto no hace exactamente lo que desea, estaría dispuesto a mejorar esta función/agregarle opciones.

+0

Creo que esto es realmente lo que quiero, muchas gracias. – saroele

+0

Existe un problema con 'combine_first': al usarlo para combinar tres dataframes de unas 30k filas, cada uno supera toda mi memoria. De cualquier forma alrededor de esto? – scry

+0

Creo que sería mucho más intuitivo si esta funcionalidad fuera parte de la función 'df.update' con el argumento opcional' join = 'outer'' (actualmente solo se implementa 'left'). En mi caso, 'df2' (calculado a partir de' df1') tiene muchas menos columnas que 'df1' (pero algunas que no están en' df1'), y quiero actualizar 'df1' con los valores calculados cuando sea posible más las columnas adicionales. Para esto, creo que 'df1.update (df2, join = 'outer')' sería mucho más fácil de entender que 'df1 = df2.combine_first (df1)'. PS. Esta es una objeción menor, pero por lo demás 'pandas' es casi exclusivamente asombrosa! =) – Axel

6

Para una fusión como esta, el método update de un DataFrame es útil.

Tomando los ejemplos de la documentation:

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan], 
        [np.nan, 7., np.nan]]) 
df2 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]], 
        index=[1, 2]) 

de datos antes de que el update: actualización

>>> df1 
    0 1 2 
0 NaN 3.0 5.0 
1 -4.6 NaN NaN 
2 NaN 7.0 NaN 
>>> 
>>> df2 
     0 1 2 
1 -42.6 NaN -8.2 
2 -5.0 1.6 4.0 

Vamos df1 con datos de df2:

df1.update(df2) 

de datos después de la actualización:

>>> df1 
     0 1 2 
0 NaN 3.0 5.0 
1 -42.6 NaN -8.2 
2 -5.0 1.6 4.0 

Observaciones:

  • Es importante tener en cuenta que esta es una operación "en su sitio", la modificación de la trama de datos que llama update.
+3

Esto es más intuitivo que 'combine_first' porque actúa exactamente como el método' update' que conocemos de los dicts. – saroele