2015-11-06 42 views
5

Supponiamo di avere un df:Python-panda Sostituire NA con la mediana o media di un gruppo in dataframe

A  B 
    apple 1.0 
    apple 2.0 
    apple NA 
    orange NA 
    orange 7.0 
    melon 14.0 
    melon NA 
    melon 15.0 
    melon 16.0 

per sostituire la NA, possiamo usare df [ "B"] fillna (df [. "B"]. Median()), ma riempirà NA con la mediana di tutti i dati in "B"

Esiste un modo per utilizzare la mediana di una determinata A per sostituire l'ND (come di seguito):

A  B 
    apple 1.0 
    apple 2.0 
    apple **1.5** 
    orange **7.0** 
    orange 7.0 
    melon 14.0 
    melon **15.0** 
    melon 15.0 
    melon 16.0 

Grazie!

+1

perché è R tagged? –

+1

'con (dd, ifelse (is.na (B), ave (B, A, FUN = funzione (x) mediana (x, na.rm = TRUE)), B))' – rawr

+0

Questo shld non ha una R tag – hrbrmstr

risposta

6

In panda è possibile utilizzare per ottenere transform nulli-riempire valori:

>>> med = df.groupby('A')['B'].transform('median') 
>>> df['B'].fillna(med) 
0  1.0 
1  2.0 
2  1.5 
3  7.0 
4  7.0 
5 14.0 
6 15.0 
7 15.0 
8 16.0 
Name: B, dtype: float64 
+0

Grazie per l'aiuto! – Robin1988

+1

Puoi farlo per tutte le colonne contemporaneamente ed evitare di dover specificare le colonne? Ad esempio, in R questo potrebbe essere fatto come df <- na.roughfix (df) – y0gapants

2

In R, è possibile utilizzare na.aggregate/data.table per sostituire il valore NA entro il del gruppo. Convertiamo "data.frame" in "data.table" (setDT(df)), raggruppato per "A", applichiamo lo na.aggregate su "B".

library(zoo) 
library(data.table) 
setDT(df)[, B:= na.aggregate(B), A] 
df 
#  A B 
#1: apple 1.0 
#2: apple 2.0 
#3: apple 1.5 
#4: orange 7.0 
#5: orange 7.0 
#6: melon 14.0 
#7: melon 15.0 
#8: melon 15.0 
#9: melon 16.0 
+0

Grazie per la tua risposta rapida. Python ha un metodo simile? – Robin1988

+1

@ Robin1988 Sì, il codice è in R. L'ho postato perché hai taggato con 'r'. – akrun

+1

Grazie! Mi ha dato alcuni indizi – Robin1988

Problemi correlati