How to fill NaN values between two values?

I have a dataframe like below. I want to fill NaN values between two existing values with the value in-between the NaN values and not on either side of the existing value.

time_expanded    start_time    end_time    name
10:30:00         NaN           NaN         NaN
10:30:10         10:30:10      10:30:40    11v11
10:30:20         NaN           NaN         NaN
10:30:30         NaN           NaN         NaN
10:30:40         10:30:10      10:30:40    11v11
10:30:50         NaN           NaN         NaN
10:31:00         10:31:00      10:31:20    zonal_game
10:31:10         NaN           NaN         NaN
10:31:20         10:31:00      10:31:20    zonal_game
10:31:30         NaN           NaN         NaN

Expected output:

time_expanded    start_time    end_time    name
10:30:00         NaN           NaN         NaN
10:30:10         10:30:10      10:30:40    11v11
10:30:20         10:30:10      10:30:40    11v11
10:30:30         10:30:10      10:30:40    11v11
10:30:40         10:30:10      10:30:40    11v11
10:30:50         NaN           NaN         NaN
10:31:00         10:31:00      10:31:20    zonal_game
10:31:10         10:31:00      10:31:20    zonal_game
10:31:20         10:31:00      10:31:20    zonal_game
10:31:30         NaN           NaN         NaN

How can you achieve this?

Any help is highly appreciated!

Upvotes: 0

Views: 781

Answers (1)

akuiper
akuiper

Reputation: 214927

You can use ffill but only keep values where ffill is equal to bfill:

df.ffill().where(df.ffill() == df.bfill())

  time_expanded start_time  end_time        name
0      10:30:00        NaN       NaN         NaN
1      10:30:10   10:30:10  10:30:40       11v11
2      10:30:20   10:30:10  10:30:40       11v11
3      10:30:30   10:30:10  10:30:40       11v11
4      10:30:40   10:30:10  10:30:40       11v11
5      10:30:50        NaN       NaN         NaN
6      10:31:00   10:31:00  10:31:20  zonal_game
7      10:31:10   10:31:00  10:31:20  zonal_game
8      10:31:20   10:31:00  10:31:20  zonal_game
9      10:31:30        NaN       NaN         NaN

Or the other way around:

df.bfill().where(df.ffill() == df.bfill())

Upvotes: 6

Related Questions