2017-09-26 33 views
1

我試圖用同一行的手段替換我的數據框中的NaN值。熊貓fillna()不按預期方式工作

sample_df = pd.DataFrame({'A':[1.0,np.nan,5.0], 
        'B':[1.0,4.0,5.0], 
        'C':[1.0,1.0,4.0], 
        'D':[6.0,5.0,5.0], 
        'E':[1.0,1.0,4.0], 
        'F':[1.0,np.nan,4.0]}) 

sample_mean = sample_df.apply(lambda x: np.mean(x.dropna().values.tolist()) ,axis=1) 

產地:

0 1.833333 
1 2.750000 
2 4.500000 
dtype: float64 

但是當我嘗試使用fillna()從一系列值,以填補缺失的數據框中的值,它似乎並沒有工作。

sample_df.fillna(sample_mean, inplace=True) 

    A  B  C  D  E  F 
0 1.0 1.0 1.0 6.0 1.0 1.0 
1 NaN 4.0 1.0 5.0 1.0 NaN 
2 5.0 5.0 4.0 5.0 4.0 4.0 

我想到的是:

A  B  C  D  E  F 
0 1.0 1.0 1.0 6.0 1.0 1.0 
1 2.75 4.0 1.0 5.0 1.0 2.75 
2 5.0 5.0 4.0 5.0 4.0 4.0 

我查看了其他類似的問題似乎並不能揭示問題。在此先感謝您的幫助。

回答

1

通過使用pandas

sample_df.T.fillna(sample_df.T.mean()).T 
Out[1284]: 
     A B C D E  F 
0 1.00 1.0 1.0 6.0 1.0 1.00 
1 2.75 4.0 1.0 5.0 1.0 2.75 
2 5.00 5.0 4.0 5.0 4.0 4.00 
1

這裏有一種方法 -

sample_df[:] = np.where(np.isnan(sample_df), sample_df.mean(1)[:,None], sample_df) 

樣本輸出 -

sample_df 
Out[61]: 
     A B C D E  F 
0 1.00 1.0 1.0 6.0 1.0 1.00 
1 2.75 4.0 1.0 5.0 1.0 2.75 
2 5.00 5.0 4.0 5.0 4.0 4.00 
1

另一個大熊貓方式:

>>> sample_df.where(pd.notnull(sample_df), sample_df.mean(axis=1), axis='rows') 
     A B C D E  F 
0 1.00 1.0 1.0 6.0 1.0 1.00 
1 2.75 4.0 1.0 5.0 1.0 2.75 
2 5.00 5.0 4.0 5.0 4.0 4.00 

一種if條件是True在操作這裏:在哪裏的pd.notnull(sample_df)元件True使用相應的元件從sample_df否則使用從元件和sample_df.mean(axis=1)沿着axis='rows'執行此邏輯。