将缺失数据添加到 Dataframe

Adding missing data to Dataframe

你好,我有一个看起来像这样的数据框

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

我想添加所有缺失的月份,以便我可以使用以下代码计算一年中每个月的预测人口。

df['pred_pop'] = (df['month'] * df['slope']) + df['intercept']

我有以下代码似乎可以工作,但我想看看是否有更简单的方法可以在不创建新列的情况下完成此操作。

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')

你可以试试

out = df.pivot('month','Year').reindex(range(1,12+1)).stack(dropna=False).reset_index()

下一步是填写 nan

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)

输出:

    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
#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

这使用了 complete function from pyjanitor.,这有助于明确暴露缺失的行;在这种情况下,我们根据 Year 列的配对以及月份列和一年中所有月份的字典构建一个新的数据框