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

时间:2019-01-11 07:41:55

标签: python pandas

我有一个如下所示的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,因为它违反了前导或尾随值。我在这个阶段一无所知。任何帮助都是可观的。

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

1 个答案:

答案 0 :(得分:2)

我认为您需要通过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