Если хотите полные месяцы, используйте MultiIndex.from_product
с Series.reindex
:
mux = pd.MultiIndex.from_product([df['Company'].unique(),
df['year'].unique(),
range(1, 13)], names=['Company','year','month'])
df = df.set_index(['Company','year','month']).reindex(mux, fill_value=0).reset_index()
При необходимости отфильтруйте по минимальному и максимальному значениям времени по исходным данным Series.between
по максимальному и минимальному времени:
orig = pd.to_datetime(df[['year','month']].assign(day=1))
new = pd.to_datetime(df1[['year','month']].assign(day=1))
df1 = df1[new.between(orig.min(), orig.max())]
print (df1)
Company year month Quantity
3 A 2019 4 1
4 A 2019 5 12
5 A 2019 6 13
6 A 2019 7 0
7 A 2019 8 0
8 A 2019 9 0
9 A 2019 10 0
10 A 2019 11 23
11 A 2019 12 0
12 A 2020 1 0
13 A 2020 2 34
27 B 2019 4 0
28 B 2019 5 0
29 B 2019 6 0
30 B 2019 7 0
31 B 2019 8 32
32 B 2019 9 0
33 B 2019 10 0
34 B 2019 11 0
35 B 2019 12 2
36 B 2020 1 0
37 B 2020 2 32