代码之家  ›  专栏  ›  技术社区  ›  Mohamed Thasin ah

如何在两个值之间填充NaN?

  •  2
  • Mohamed Thasin ah  · 技术社区  · 6 年前

    我有一个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   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 值之间不发生。但我想在第三排的第四列和第五列填上。因为这两列包含两个值(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 ,因为它会完全填满,同样我不能使用 ffill bfill ,因为它违反了前导值或尾随值。在这个阶段,我一无所知。任何帮助都是可以理解的。

    注意:在与此相关的搜索之后,我提出了这个问题。我找不到与此相关的任何副本。如果你觉得可以随意标记为副本。

    1 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    我认为你需要得到一个布尔掩码,其中缺少的值没有前一行和后一行,用两种方法-前向填充和后向填充缺少的值,检查不缺少的值或创建累计和,并进行比较 >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