2017-09-24 3 views
1

Ich versuche, den Wert unter Verwendung der Zeile mit ähnlichen Spalten 'Werte zu imputieren.Pandas fillna using groupby

Zum Beispiel, ich habe diesen Datenrahmen

one | two | three 
1  1  10 
1  1  nan 
1  1  nan 
1  2  nan 
1  2  20 
1  2  nan 
1  3  nan 
1  3  nan 

ich mit den Tasten der Spalte [ ‚one‘] und [ ‚zwei‘], die ähnlich und wenn Spalte wollte [ ‚drei‘] nicht ganz nan dann den vorhandenen Wert aus einer Reihe von ähnlichen Schlüsseln mit dem Wert in der Spalte zuzurechnet [ ‚3‘]

Hier ist mein Wunsch Ergebnis

one | two | three 
1  1  10 
1  1  10 
1  1  10 
1  2  20 
1  2  20 
1  2  20 
1  3  nan 
1  3  nan 

Sie können sehen, dass die Tasten 1 und 3 enthalten keine Wert weil t Der existierende Wert existiert nicht.

Ich habe versucht, groupby fillna mit()

df['three'] = df.groupby(['one','two'])['three'].fillna() 

, die mir einen Fehler gab.

Ich habe versucht, füllen, die mir eher seltsame Ergebnis, wo es weiterleiten die Spalte 2 stattdessen geben. Ich verwende diesen Code für die Vorwärtsfüllung.

df['three'] = df.groupby(['one','two'], sort=False)['three'].ffill() 

Vielen Dank für Ihre Zeit.

Antwort

4

Wenn nur ein nicht NaN Wert pro Gruppe Verwendung ffill (forward-Füllung) und bfill (rückwärts Füllung) pro Gruppe, so müssen apply mit lambda:

df['three'] = df.groupby(['one','two'], sort=False)['three'] 
       .apply(lambda x: x.ffill().bfill()) 
print (df) 
    one two three 
0 1 1 10.0 
1 1 1 10.0 
2 1 1 10.0 
3 1 2 20.0 
4 1 2 20.0 
5 1 2 20.0 
6 1 3 NaN 
7 1 3 NaN 

Aber wenn mehrere Werte pro Gruppe und ersetzen müssen NaN durch eine Konstante - z mean nach Gruppe:

print (df) 
    one two three 
0 1 1 10.0 
1 1 1 40.0 
2 1 1 NaN 
3 1 2 NaN 
4 1 2 20.0 
5 1 2 NaN 
6 1 3 NaN 
7 1 3 NaN 

df['three'] = df.groupby(['one','two'], sort=False)['three'] 
       .apply(lambda x: x.fillna(x.mean())) 
print (df) 
    one two three 
0 1 1 10.0 
1 1 1 40.0 
2 1 1 25.0 
3 1 2 20.0 
4 1 2 20.0 
5 1 2 20.0 
6 1 3 NaN 
7 1 3 NaN 
+0

Das war genau das, was ich brauchte. Vielen Dank! –