2012-08-31 11 views
5

Supongamos que tengo dos tramas de datos 'df_a' & 'df_b', ambos tienen la misma estructura de índice y columnas, pero algunos de los elementos de datos en el interior son diferentes:¿Cómo reemplazar y agregar el elemento de marco de datos por otro marco de datos en Python Pandas?

>>> df_a 
      sales cogs 
STK_ID QT   
000876 1 100 100 
     2 100 100 
     3 100 100 
     4 100 100 
     5 100 100 
     6 100 100 
     7 100 100 

>>> df_b 
      sales cogs 
STK_ID QT   
000876 5 50 50 
     6 50 50 
     7 50 50 
     8 50 50 
     9 50 50 
     10 50 50 

Y ahora quiero reemplazar el elemento de df_a por elemento de df_b que tienen la misma coordenada (índice, columna), y adjuntar los elementos de df_b cuya coordenada (índice, columna) va más allá del alcance de df_a. Al igual que añadir un parche 'df_b' a 'df_a':

>>> df_c = patch(df_a,df_b) 
      sales cogs 
STK_ID QT   
000876 1 100 100 
     2 100 100 
     3 100 100 
     4 100 100 
     5 50 50 
     6 50 50 
     7 50 50 
     8 50 50 
     9 50 50 
     10 50 50 

la forma de escribir el 'parche (df_a df_b,)' función?

+0

Esto parece un caso de uso para el df_a.update aún no implementado (df_b, unirse a 'exterior' =) ayuda, consulte (df_a.update) –

+0

¿No es solo 'combine_first' (por debajo)? –

Respuesta

1

Similar a la respuesta de BrenBarn, pero con mayor flexibilidad:

# reindex both to union of indices 
df_ar = df_a.reindex(df_a.index | df_b.index) 
df_br = df_b.reindex(df_a.index | df_b.index) 

# replacement criteria can be put in this lambda function 
combiner = lambda: x, y: np.where(y < x, y, x) 
df_c = df_ar.combine(df.br, combiner) 
+0

Creo que en la 2da línea 'df_a.index' ya incluye' df_b.index' – Winand

+0

@Winand Correct. Lo arreglé. –

2

Prueba esto:

df_c = df_a.reindex(df_a.index | df_b.index) 
df_c.ix[df_b.index] = df_b 
2

para llenar los vacíos en una trama de datos con los valores (o incluso filas completas) de otro, tomar una mira el método incorporado df.combine_first().

In [34]: df_b.combine_first(df_a) 
Out[34]: 
      sales cogs 
STK_ID QT    
000876 1  100 100 
     2  100 100 
     3  100 100 
     4  100 100 
     5  50 50 
     6  50 50 
     7  50 50 
     8  50 50 
     9  50 50 
     10  50 50 
0

Tenía problemas con el mismo problema, el código de las respuestas anteriores no funcionaba en mis marcos de datos. Tienen 2 columnas de índice y la operación de reindexa da como resultado valores de NaN en lugares extraños (publicaré el contenido del marco de datos si alguien está dispuesto a depurarlo).

Encontré una solución alternativa. Estoy revivir este hilo esperando que esto puede ser útil a los demás:

# concatenate df_a and df_b 
df_c = concat([dfbd,dfplanilhas]) 

# clears the indexes (turns the index columns into regular dataframe columns) 
df_c.reset_index(inplace='True') 

# removes duplicates keeping the last occurence (hence updating df_a with values from df_b) 
df_c.drop_duplicates(subset=['df_a','df_b'], take_last='True', inplace='True') 

No es una solución muy elegante, pero parece que funciona.

espero df.update obtiene opción de una unión externa = '' pronto ...

Cuestiones relacionadas