How to fill NANs with a specific row of data

Question:

I am a new python user and have a few questions regarding filling NA’s of a data frame.

Currently, I have a data frame that has a series of dates from 2022-08-01 to 2037-08-01 with a frequency of monthly data.

However, after 2027-06-01 the pricing data stops and I would like to extrapolate the values forward to fill out the rest of the dates. Essentially I would like to take the last 12 months of prices and fill those forward for the rest of the data frame. I am thinking of doing some type of groupby month with a fillna(method=ffill) however when I do this it just fills the last value in the df forward. Below is an example of my code.

Above is a picture you will see that the values stop at 12/1/2023 I wish to fill the previous 12 values forward for the rest of the maturity dates. So all prices fro 1/1/2023 to 12/1/2023 will be fill forward for all months.

import pandas as pd

mat = pd.DataFrame(pd.date_range('01/01/2020','01/01/2022',freq='MS'))
prices = pd.DataFrame(['179.06','174.6','182.3','205.59','204.78','202.19','216.17','218.69','220.73','223.28','225.16','226.31'])

example = pd.concat([mat,prices],axis=1)
example.columns = ['maturity', 'price']

Output

0  2020-01-01  179.06
1  2020-02-01   174.6
2  2020-03-01   182.3
3  2020-04-01  205.59
4  2020-05-01  204.78
5  2020-06-01  202.19
6  2020-07-01  216.17
7  2020-08-01  218.69
8  2020-09-01  220.73
9  2020-10-01  223.28
10 2020-11-01  225.16
11 2020-12-01  226.31
12 2021-01-01     NaN
13 2021-02-01     NaN
14 2021-03-01     NaN
15 2021-04-01     NaN
16 2021-05-01     NaN
17 2021-06-01     NaN
18 2021-07-01     NaN
19 2021-08-01     NaN
20 2021-09-01     NaN
21 2021-10-01     NaN
22 2021-11-01     NaN
23 2021-12-01     NaN
24 2022-01-01     NaN
Asked By: ARE

||

Answers:

Is this what you’re looking for?

out = df.groupby(df.maturity.dt.month).ffill()
print(out)

Output:

     maturity   price
0  2020-01-01  179.06
1  2020-02-01   174.6
2  2020-03-01   182.3
3  2020-04-01  205.59
4  2020-05-01  204.78
5  2020-06-01  202.19
6  2020-07-01  216.17
7  2020-08-01  218.69
8  2020-09-01  220.73
9  2020-10-01  223.28
10 2020-11-01  225.16
11 2020-12-01  226.31
12 2021-01-01  179.06
13 2021-02-01   174.6
14 2021-03-01   182.3
15 2021-04-01  205.59
16 2021-05-01  204.78
17 2021-06-01  202.19
18 2021-07-01  216.17
19 2021-08-01  218.69
20 2021-09-01  220.73
21 2021-10-01  223.28
22 2021-11-01  225.16
23 2021-12-01  226.31
24 2022-01-01  179.06
Answered By: BeRT2me
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.