2015-03-30 20 views
7

Non riesco a trovare una funzione panda (che avevo visto prima) per sostituire i NaN in un dataframe con valori di un altro dataframe (assumendo un indice comune che può essere specificato). Qualsiasi aiuto?I panda riempiono i valori mancanti nel dataframe da un altro dataframe

+0

Suoni Come si desidera unire. Si prega di mostrare alcuni esempi di scenari. –

+0

trovato! Volevo utilizzare combine_first – user308827

+1

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.Series.combine_first.html – user308827

risposta

11

Se si dispone di due DataFrames della stessa forma, quindi:

df[df.isnull()] = d2 

farà il trucco.

visual representation

Solo luoghi in cui df.isnull() restituisce True (evidenziato in verde) potranno beneficiare di assegnazione.

In pratica, i DataFrames non hanno sempre le stesse dimensioni/forma e sono utili i metodi di trasformazione (in particolare .shift()).

I dati in arrivo sono invariabilmente sporchi, incompleti o incoerenti. Par per il corso. C'è un panda piuttosto esteso tutorial and associated cookbook per affrontare queste situazioni.

5

Come ho appena appreso, c'è un metodo DataFrame.combine_first(), che fa proprio questo, con l'ulteriore proprietà che se la cornice di dati di aggiornamento d2 è più grande rispetto all'originale df, sono aggiunte le righe e le colonne aggiuntive, pure.

df = df.combine_first(d2) 
3

DataFrame.combine_first() risponde esattamente a questa domanda.

Tuttavia, a volte si desidera riempire/sostituire/sovrascrivere alcuni dei valori non mancanti (non-NAN) di dataframe A con valori da dataframe B. Tale questione mi ha portato a questa pagina, e la soluzione è DataFrame.mask()

A = B.mask(condition, A) 

Quando condition è vero, verranno utilizzati i valori da A, altrimenti verranno utilizzati i valori di B.

Ad esempio, si potrebbe risolvere domanda originale del PO con mask tale che quando un elemento da A non è NaN, usarlo, altrimenti utilizzare l'elemento corrispondente di B.

Ma usando DataFrame.mask() si potrebbe sostituire il valori di A che non soddisfano criteri arbitrari (meno di zero? più di 100?) con valori di B. Quindi mask è più flessibile e eccessivo per questo problema, ma ho pensato che fosse degno di menzione (ne avevo bisogno per risolvere il mio problema).

È anche importante notare che B potrebbe essere una matrice numpy invece di un DataFrame. DataFrame.combine_first() richiede che B sia un DataFrame, ma DataFrame.mask() richiede solo che B sia un NDFame e che le sue dimensioni corrispondano alle dimensioni di A.

Problemi correlati