2015-11-06 11 views
5

Angenommen, wir haben eine df:Python-Pandas NA Ersetzen mit dem Median oder Mittelwert einer Gruppe in Datenrahmen

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 

die NA ersetzen, können wir df verwenden [ "B"] fillna (df [. "B"]. Median()), aber es wird NA mit dem Median aller Daten in "B" füllen

Gibt es irgendeine Möglichkeit, dass wir den Median eines bestimmten A verwenden können, um die NA zu ersetzen (wie unten)):

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 

Danke!

+1

warum R markiert? –

+1

'mit (dd, ifelse (is.na (B), ave (B, A, FUN = Funktion (x) Median (x, na.rm = WAHR)), B))' – rawr

+0

Diese Shell hat kein R Tag – hrbrmstr

Antwort

6

In Pandas können Sie transform verwenden null-fill-Werte zu erhalten:

>>> 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

Danke für die Hilfe! – Robin1988

+1

Können Sie das für alle Spalten gleichzeitig tun und vermeiden, Spalten angeben zu müssen? In R könnte dies zum Beispiel als df <- na.roughfix (df) gemacht werden – y0gapants

2

In R kann na.aggregate/data.table den Wert NA durch mean Wert der Gruppe ersetzen. Wir konvertieren den 'data.frame' in 'data.table' (setDT(df)), gruppiert nach 'A', wenden Sie die na.aggregate auf 'B' an.

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

Vielen Dank für Ihre schnelle Antwort. Hat Python ähnliche Methode? – Robin1988

+1

@ Robin1988 Ja, der Code ist in R. Ich postete ihn, weil du mit "r" getaggt hast. – akrun

+1

Danke! Es gab mir einige Hinweise – Robin1988

Verwandte Themen