【问题标题】:how can I fill NaN values by the mean of the adjacent column in Pandas DataFrame with a loop如何通过循环使用 Pandas DataFrame 中相邻列的平均值填充 NaN 值
【发布时间】:2020-10-21 01:20:39
【问题描述】:

我有一个大数据集,我有一些缺失值,我想用前后列的平均值填充 NAN 值,在某些情况下我有连续的 NaN 值,在这些情况下我想替换所有这些 nan 值都可以通过非 nan 的第一个值找到,例如:我应该使用循环

   0   1     2   3     4     5   6   7  8  9  10  11    12    13  14    15    16
19.0  NaN  NaN NaN  29.0  30.0 NaN 16.0  15.0 16.0  17.0 NaN  28.0  30.0 NaN  28.0  18.0

我们的目标是让数据看起来像这样:

 0   1     2   3     4     5   6   7  8  9  10  11    12    13  14    15    16
19.0  29.0  29.0 29.0  29.0  30.0 23.0 16.0  15.0 16.0  17.0 22.5 28.0  30.0 29  28.0  18.0

【问题讨论】:

  • 你有什么理由想输入平均值吗?如果在 19 到 29 之间有:21.5、24 和 26.5。你会接受吗?

标签: pandas dataframe rows mean


【解决方案1】:

让我们试试吧:

# where df is not null
s = df.notna()

# check for `NaN` with valid left and right:    
mask = s.shift(1, axis=1) & s.shift(-1, axis=1)

# fill as required
df[:] = np.where(mask, df.interpolate(axis=1), df.bfill(axis=1).ffill(axis=1))

输出:

      0     1     2     3     4     5     6     7     8     9    10    11  \
0  19.0  29.0  29.0  29.0  29.0  30.0  23.0  16.0  15.0  16.0  17.0  22.5   

     12    13    14    15    16  
0  28.0  30.0  29.0  28.0  18.0  

【讨论】:

    【解决方案2】:

    import numpy as np 
    import pandas as pd 
    
    a = "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 19.0 NaN NaN NaN 29.0 30.0 NaN 16.0 15.0 16.0 17.0 NaN 28.0 30.0 NaN 28.0 18.0"
    
    l = np.array([int(float(e)) if e != 'NaN' else np.nan for e in a.split(' ')])
    

    那么你正在寻找的可以通过

    subset_ranges = [0, 3]
    replacements = {}
    
    for i in range(len(l)-1):
        subset = l[subset_ranges[0]: subset_ranges[1]]
        if pd.isnull(subset[1]) and not pd.isnull(subset[0]) and not pd.isnull(subset[2]):
            replacements[subset_ranges[0]+1] = np.nanmean(subset)
        subset_ranges[0] += 1
        subset_ranges[1] += 1
    l = np.array([e if i not in replacements.keys() else replacements[i] for i, e in enumerate(l)])
    
    df = pd.DataFrame(l.reshape(-1, 1))
    df.fillna(method='bfill', inplace=True)
    

    【讨论】:

    • 我有一个数据框(2592 行 × 18 列)而不是一个系列,我该怎么做?
    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 2013-09-12
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多