Hello I have a dataframe that looks like this
Year month pop slope intercept
2020 2 10 5.8 -3.2
2020 3 15 5.8 -3.2
2020 4 17 5.8 -3.2
2020 9 50 5.8 -3.2
2021 1 5 8 -8.5
2021 5 20 8 -8.5
2021 10 75 8 -8.5
I would like to add all of the missing months so that I can calculate a predicted population for every month of the year with the following code.
df['pred_pop'] = (df['month'] * df['slope']) df['intercept']
I have the following code that seems to work but I was looking to see if there was an easier way to accomplish this without creating a new column.
df['new_month'] = df.apply(lambda x: [1,2,3,4,5,6,7,8,9,10,11,12], axis=1)
df = df.explode('new_month')
CodePudding user response:
Months = [*range(1, 13, 1)]
mux = pd.MultiIndex.from_product([df['Year'].unique(), Months], names=('Year','month'))
df = df.set_index(['Year','month']).reindex(mux).swaplevel(0,1).reset_index()
print(df)
output:
month Year pop slope intercept
0 1 2020 NaN NaN NaN
1 2 2020 10.0 5.8 -3.2
2 3 2020 15.0 5.8 -3.2
3 4 2020 17.0 5.8 -3.2
4 5 2020 NaN NaN NaN
5 6 2020 NaN NaN NaN
6 7 2020 NaN NaN NaN
7 8 2020 NaN NaN NaN
8 9 2020 50.0 5.8 -3.2
9 10 2020 NaN NaN NaN
10 11 2020 NaN NaN NaN
11 12 2020 NaN NaN NaN
12 1 2021 5.0 8.0 -8.5
13 2 2021 NaN NaN NaN
14 3 2021 NaN NaN NaN
15 4 2021 NaN NaN NaN
16 5 2021 20.0 8.0 -8.5
17 6 2021 NaN NaN NaN
18 7 2021 NaN NaN NaN
19 8 2021 NaN NaN NaN
20 9 2021 NaN NaN NaN
21 10 2021 75.0 8.0 -8.5
22 11 2021 NaN NaN NaN
23 12 2021 NaN NaN NaN
CodePudding user response:
You can try
out = df.pivot('month','Year').reindex(range(1,12 1)).stack(dropna=False).reset_index()
And next step is to fill the nan
CodePudding user response:
#pip install git https://github.com/pyjanitor-devs/pyjanitor.git
import pandas as pd
import janitor
df.complete('Year', dict(month=range(1,13)), sort = True)
Year month pop slope intercept
0 2020 1 NaN NaN NaN
1 2020 2 10.0 5.8 -3.2
2 2020 3 15.0 5.8 -3.2
3 2020 4 17.0 5.8 -3.2
4 2020 5 NaN NaN NaN
5 2020 6 NaN NaN NaN
6 2020 7 NaN NaN NaN
7 2020 8 NaN NaN NaN
8 2020 9 50.0 5.8 -3.2
9 2020 10 NaN NaN NaN
10 2020 11 NaN NaN NaN
11 2020 12 NaN NaN NaN
12 2021 1 5.0 8.0 -8.5
13 2021 2 NaN NaN NaN
14 2021 3 NaN NaN NaN
15 2021 4 NaN NaN NaN
16 2021 5 20.0 8.0 -8.5
17 2021 6 NaN NaN NaN
18 2021 7 NaN NaN NaN
19 2021 8 NaN NaN NaN
20 2021 9 NaN NaN NaN
21 2021 10 75.0 8.0 -8.5
22 2021 11 NaN NaN NaN
23 2021 12 NaN NaN NaN
This uses the complete function from pyjanitor., which can be helpful in explicitly exposing missing rows; in this case, we build a new dataframe from the pairing of the Year
column, and a dictionary of the month column and all the months in a year