【问题标题】:Fill cell containing NaN with average of value before and after用前后平均值填充包含 NaN 的单元格
【发布时间】:2020-03-04 22:09:47
【问题描述】:

我想用缺失值之前和之后的单元格的平均值填充 pandas 数据框中的缺失值。因此,如果它是 [1, NaN, 3],则 NaN 值将是 2,因为 (1 + 3)/2。我找不到任何使用 Pandas 或 Scikit-learn 的方法。有没有办法做到这一点?

【问题讨论】:

    标签: python pandas scikit-learn


    【解决方案1】:

    考虑这个数据框

    df = pd.DataFrame({'val': [1,np.nan, 4, 5, np.nan, 10]})
    
        val
    0   1.0
    1   NaN
    2   4.0
    3   5.0
    4   NaN
    5   10.0
    

    您可以使用 fillna 和 shift() 来获得所需的输出

    df.val = df.val.fillna((df.val.shift() + df.val.shift(-1))/2)
    

    你得到

        val
    0   1.0
    1   2.5
    2   4.0
    3   5.0
    4   7.5
    5   10.0
    

    【讨论】:

    • @Vaishali 如果顺序有多个空值,此解决方案将不起作用。您已经关闭了一个问题,它解决了该特定问题作为该问题的副本,而该问题不是。这是question 请重新打开它。
    【解决方案2】:

    使用 spies006 的示例 df。

    df = pd.DataFrame({'a': [10, 6, -3, -2, 4, 12, 3, 3], 
    'b': [6, -3, np.nan, 12, 8, 11, -5, -5], 
    'id': [1, 1, 1, 1, np.nan, 2, 2, 4]})
    
    #use np.where to locate the nans and fill it with the average of surrounding elements.
    df.where(df.notnull(), other=(df.fillna(method='ffill')+df.fillna(method='bfill'))/2)
    Out[2517]: 
        a     b   id
    0  10   6.0  1.0
    1   6  -3.0  1.0
    2  -3   4.5  1.0
    3  -2  12.0  1.0
    4   4   8.0  1.5
    5  12  11.0  2.0
    6   3  -5.0  2.0
    7   3  -5.0  4.0
    

    【讨论】:

      【解决方案3】:

      如果您没有任何 NaN 值作为最后一个索引,这将起作用,您的插补方法暗示这是正确的。

      >>> data = pd.DataFrame({'a': [10, 6, -3, -2, 4, 12, 3, 3], 
      'b': [6, -3, np.nan, 12, 8, 11, -5, -5], 
      'id': [1, 1, 1, 1, np.nan, 2, 2, 4]})
      >>> data
          a     b   id
      0  10   6.0  1.0
      1   6  -3.0  1.0
      2  -3   NaN  1.0
      3  -2  12.0  1.0
      4   4   8.0  NaN
      5  12  11.0  2.0
      6   3  -5.0  2.0
      7   3  -5.0  4.0
      
      
      
      >>> nan_cols = data.columns[data.isnull().any(axis=0)]
      >>> for col in nan_cols:
      ...     for i in range(len(data)):
      ...             if pd.isnull(data.loc[i, col]):
      ...                     data.loc[i, col] = (data.loc[i-1, col] + data.loc[i+1, col])/2
      
      
      >>> data
          a     b   id
      0  10   6.0  1.0
      1   6  -3.0  1.0
      2  -3   4.5  1.0
      3  -2  12.0  1.0
      4   4   8.0  1.5
      5  12  11.0  2.0
      6   3  -5.0  2.0
      7   3  -5.0  4.0
      

      【讨论】:

        猜你喜欢
        • 2018-09-19
        • 2021-10-09
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        相关资源
        最近更新 更多