2017-09-26 32 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'执行此逻辑。