Home > Enterprise >  Adding missing data to Dataframe
Adding missing data to Dataframe

Time:11-16

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

  • Related