【问题标题】:Replace NaN values in entire dataframe with average of others将整个数据框中的 NaN 值替换为其他值的平均值
【发布时间】:2018-09-18 23:24:11
【问题描述】:

我有几个 DataFrame(DataFrame 具有相同的索引和列结构)。问题是这些数据帧中有 NaN 值。

我想用其他DataFrames对应值的平均值替换这些NaN值。

例如,让我们看看 3 个数据帧。

DataFrame1 与 1:M2 NaN :

   M1   M2    M3        
0  1    1     2  
1  8   NaN    9 
2  4    2     7       
3  9    6     3  

DataFrame 2 的 NaN 值为 0:M3:

   M1   M2    M3        
0  2    3    NaN  
1  1    1     6 
2  1    2     9       
3  4    6     2

数据帧3:

   M1   M2    M3        
0  1    4     2  
1  2    9     1 
2  1    6     5       
3  1    NaN     4

所以我们将第一个 DataFrame 中的 NaN 替换为 5 (9+1)/2。第二个 NaN 应替换为 2,因为 (2+2)/2,第三个由 6 替换,依此类推。

有什么好的优雅的方法吗?

【问题讨论】:

    标签: python pandas numpy dataframe nan


    【解决方案1】:

    我们可以 concat ,然后使用 groupby fillna ,拆分后应该得到你需要的东西

    s=pd.concat([df1,df2,df3],keys=[1,2,3])
    s=s.groupby(level=1).apply(lambda x : x.fillna(x.mean()))
    df1,df2,df3=[x.reset_index(level=0,drop=True) for _,x in s.groupby(level=0)]
    df1
    Out[1737]: 
       M1   M2   M3
    0   1  1.0  2.0
    1   8  5.0  9.0
    2   4  2.0  7.0
    3   9  6.0  3.0
    

    【讨论】:

      【解决方案2】:

      这是使用numpy.nanmean 的一种方式。

      avg = np.nanmean([df1.values, df2.values, df3.values], axis=0)
      
      for df in [df1, df2, df3]:
          df[df.isnull()] = avg
          df = df.astype(int)
      

      注意:由于np.nanfloat,我们显式转换回int

      【讨论】:

      • 它适用于您提供的数据。不确定您的数据框中有什么。我假设您的数据框中的NaNnp.nan,而不是字符串。我会检查每个数据帧的df.dtypes
      • avg = np.nanmean([df1.values, df2.values, df3.values], axis=0) 给出TypeError: Can't convert 'int' object to str implicitly 错误
      • 它们是对象
      • @DavidLihtalia,这就是问题所在。将您的数据转换为数字类型,例如df = df.astype(float) 在你做任何事情之前。您不应该在 object dtype 中保存数字数据。
      猜你喜欢
      • 2013-01-13
      • 2018-04-30
      • 1970-01-01
      • 2021-10-25
      • 2014-10-03
      • 2019-03-21
      • 2018-12-14
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多