2012-08-31 2 views
5

Supponiamo di avere due frame di dati 'df_a' & 'df_b', entrambi hanno la stessa struttura e colonne di indice, ma alcuni degli elementi di dati interni sono diversi:Come sostituire e aggiungere l'elemento dataframe da un altro dataframe in 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 

E ora voglio sostituire l'elemento di df_a per elemento di df_b che hanno la stessa coordinata (indice, colonna) e allegano gli elementi di df_b le cui coordinate (indice, colonna) oltre l'ambito di df_a. Proprio come aggiungere una patch '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 

come scrivere il 'patch (df_a, df_b)' funzione?

+0

Questo appare come un caso d'uso per l'df_a.update non ancora implementato (df_b, unire 'esterna' =), consultare la Guida (df_a.update) –

+0

Non è solo 'combine_first' (per sotto)? –

risposta

1

Simile alla risposta di BrenBarn, ma con una maggiore flessibilità:

# 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

Penso che nella seconda riga 'df_a.index' includa già' df_b.index' – Winand

+0

@Winand corretto. L'ho riparato. –

2

Prova questo:

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

per colmare le lacune in una dataframe con i valori (o anche righe pieno) da un altro, prendere un guarda il metodo integrato 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

ero alle prese con lo stesso problema, il codice nelle risposte precedenti non ha funzionato nella mia dataframes. Hanno 2 colonne indice e l'operazione di reindex produce valori NaN in posti strani (posterò i contenuti del dataframe se qualcuno è disposto a eseguirne il debug).

Ho trovato una soluzione alternativa. Sto rianimando questo thread sperando che questo possa essere utile ad altri:

# 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') 

Non è una soluzione molto elegante, ma sembra funzionare.

Spero df.update ottiene 'esterno' opzione a unirsi = presto ...