2017-01-16 110 views
1

我有一個數據幀有4列(A,B,C,D)。 D有一些NaN條目。我想用具有相同A,B,C值的D的平均值填充NaN值。例如,如果A,B,C,D的值分別爲x,y,z和Nan,那麼我希望將NaN值替換爲D的平均值,其中A ,B,C分別是x,y,z。如何在pandas中輸出groupby輸出?

+1

如果我或另一種答案是有幫助的,不要忘了[接受](HTTP://meta.stackexchange .com/a/5235/295067) - 點擊答案旁邊的複選標記('✓'),將其從灰色變爲填充。謝謝。 – jezrael

回答

4

我想你需要:

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

樣品:

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 
1

df['D'].fillna(df.groupby(['A','B','C'])['D'].transform('mean'))將快於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 

詳細

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