Pandas fillna()没有按预期工作

时间:2017-09-26 16:31:32

标签: python pandas numpy

我正在尝试使用来自同一行的方法替换数据框中的NaN值。

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

我已经回顾了其他类似的问题,似乎无法揭开问题。在此先感谢您的帮助。

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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'执行此逻辑。