【问题标题】:How to fill NaN between two values?如何在两个值之间填充 NaN?
【发布时间】:2019-01-11 07:41:55
【问题描述】:

我有一个如下所示的 df。我想用两个值之间的某个值填充NA。

   col1  col2  col3  col4  col5  col6  col7  col8
0   NaN    12  12.0   4.0   NaN   NaN   NaN   NaN
1  54.0    54  32.0  11.0  21.0   NaN   NaN   NaN
2   3.0    34  34.0   NaN   NaN  43.0   NaN   NaN
3  34.0    34   NaN   NaN  34.0  34.0  34.0  34.0
4   NaN    34  34.0   NaN  34.0  34.0  34.0  34.0

例如,我不想在第一行和第二行填写,因为NaN 不会出现在值之间。但我想在 col4 和 col5 的第三行填写。因为这两列在两个值(col3 和 col6)之间包含 NaN。

如何做到这一点,

预期输出:

   col1  col2  col3  col4  col5  col6  col7  col8
0   NaN    12  12.0   4.0   NaN   NaN   NaN   NaN
1  54.0    54  32.0  11.0  21.0   NaN   NaN   NaN
2   3.0    34  34.0  -100  -100  43.0   NaN   NaN
3  34.0    34  -100  -100  34.0  34.0  34.0  34.0
4   NaN    34  34.0  -100  34.0  34.0  34.0  34.0

针对这个问题 我不能简单地使用fillna,因为它会完全填充,同样我不能使用ffillbfill,因为它违反了前导值或尾随值。在这个阶段我一无所知。任何帮助都将是可观的。

注意:在与此相关的搜索之后,我提出了这个问题。我没有找到与此相关的任何重复项。如果您发现可以随意将其标记为重复。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为您需要通过 2 种方法获取布尔掩码,其中缺少第一行和最后一行的缺失值 - 正向填充和回填缺失值并检查非缺失值或通过比较 >0 创建累积总和:

    m = df.ffill(axis=1).notnull() & df.bfill(axis=1).notnull()
    #alternative mask
    a = df.notnull()
    m = a.cumsum(axis=1).gt(0) & a.iloc[:, ::-1].cumsum(axis=1).gt(0)
    df = df.mask(m, df.fillna(-100))
    print (df)
       col1  col2   col3   col4   col5  col6  col7  col8
    0   NaN    12   12.0    4.0    NaN   NaN   NaN   NaN
    1  54.0    54   32.0   11.0   21.0   NaN   NaN   NaN
    2   3.0    34   34.0 -100.0 -100.0  43.0   NaN   NaN
    3  34.0    34 -100.0 -100.0   34.0  34.0  34.0  34.0
    4   NaN    34   34.0 -100.0   34.0  34.0  34.0  34.0
    

    详情

    print (m)
        col1  col2  col3  col4   col5   col6   col7   col8
    0  False  True  True  True  False  False  False  False
    1   True  True  True  True   True  False  False  False
    2   True  True  True  True   True   True  False  False
    3   True  True  True  True   True   True   True   True
    4  False  True  True  True   True   True   True   True
    

    【讨论】: