Foward-fill dataframe based on mask. Fill with last valid value

Viewed 258

I have a dataframe like the following:

index,col1,col2
1,NaN,NaN
2,NaN,NaN
3,NaN,20
4,NaN,21
5,10,22
6,11,23
7,12,24
8,13,NaN
9,NaN,NaN

And a boolean mask dataframe like the following:

index,col1,col2
1,False,False
2,False,False
3,False,False
4,False,True
5,False,False
6,False,False
7,True,True
8,True,False
9,False,False

I would like to convert them to this final dataframe:

index,col1,col2
1,NaN,NaN
2,NaN,NaN
3,NaN,20
4,NaN,20
5,10,22
6,11,23
7,11,23
8,11,NaN
9,NaN,NaN

That is: foward-filling the values matching True on the mask with the last value in the column having False in the mask. How can I get this?

1 Answers

Let's try:

df.mask(mask).ffill().where(df.notna())

Output:

       col1  col2
index            
1       NaN   NaN
2       NaN   NaN
3       NaN  20.0
4       NaN  20.0
5      10.0  22.0
6      11.0  23.0
7      11.0  23.0
8      11.0   NaN
9       NaN   NaN
Related