2017-01-16 2 views
1

Ich habe einen Datenrahmen mit 4 Spalten (A, B, C, D). D hat einige NaN-Einträge. Ich möchte die NaN-Werte durch den Durchschnittswert von D mit dem gleichen Wert von A, B, C füllen. Wenn der Wert von A, B, C, D beispielsweise x, y, z und Nan ist, möchte ich, dass der NaN-Wert durch den Durchschnitt von D für die Zeilen mit dem Wert von A ersetzt wird , B, C sind jeweils x, y, z.Wie fillna von groupby Ausgaben in Pandas?

+1

Wenn meine oder eine andere Antwort war hilfreich, vergessen Sie nicht [akzeptieren] (http: //meta.stackexchange .com/a/5235/295067) es - klicke auf das Häkchen ('✓') neben der Antwort, um es von ausgegraut auf ausgefüllt zu setzen. Danke. – jezrael

Antwort

4

Ich glaube, Sie brauchen:

df.D = df.groupby(['A','B','C'])['D'].apply(lambda x: x.fillna(x.mean())) 

Probe:

df = pd.DataFrame({'A':[1,1,1,3], 
        'B':[1,1,1,3], 
        'C':[1,1,1,3], 
        'D':[1,np.nan,3,5]}) 

print (df) 
    A B C D 
0 1 1 1 1.0 
1 1 1 1 NaN 
2 1 1 1 3.0 
3 3 3 3 5.0 

df.D = df.groupby(['A','B','C'])['D'].apply(lambda x: x.fillna(x.mean())) 
print (df) 
    A B C D 
0 1 1 1 1.0 
1 1 1 1 2.0 
2 1 1 1 3.0 
3 3 3 3 5.0 
2

Link für weitere Informationen über diese Frage zu duplizieren: Pandas Dataframe: Replacing NaN with row average

anderen vorgeschlagene Art und Weise, es zu tun in dem genannten Link verwendet eine einfache Füllmethode für die Transponierte: df.T.fillna(df.mean(axis=1)).T

1

df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean')) wäre schneller als apply

In [2400]: df 
Out[2400]: 
    A B C D 
0 1 1 1 1.0 
1 1 1 1 NaN 
2 1 1 1 3.0 
3 3 3 3 5.0 

In [2401]: df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean')) 
Out[2401]: 
0 1.0 
1 2.0 
2 3.0 
3 5.0 
Name: D, dtype: float64 

In [2402]: df['D'] = df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean')) 

In [2403]: df 
Out[2403]: 
    A B C D 
0 1 1 1 1.0 
1 1 1 1 2.0 
2 1 1 1 3.0 
3 3 3 3 5.0 

Einzelheiten

In [2396]: df.shape 
Out[2396]: (10000, 4) 

In [2398]: %timeit df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean')) 
100 loops, best of 3: 3.44 ms per loop 


In [2397]: %timeit df.groupby(['A','B','C'])['D'].apply(lambda x: x.fillna(x.mean())) 
100 loops, best of 3: 5.34 ms per loop