Pandas:从较小的数据帧中减去数据帧:行数不足时重新开始

Pandas: Subtracting a dataframe from a smaller dataframe: Start again when out of rows

我有两个这样的数据框

df1

    date    value
0   2019-Jan    200
1   2019-Feb    200
2   2019-Mrz    300
3   2019-Apr    300
4   2019-Mai    400
5   2019-Jun    400
6   2019-Jul    500
7   2019-Aug    500
8   2019-Sep    600
9   2019-Okt    600
10  2019-Nov    700
11  2019-Dez    700

df2

    date    value
0   2020-Jan    100
1   2020-Feb    200
2   2020-Mrz    300
3   2020-Apr    100
4   2020-Mai    200 
5   2020-Jun    300
6   2020-Jul    100
7   2020-Aug    200
8   2020-Sep    300
9   2020-Okt    100
10  2020-Nov    200
11  2020-Dez    300
12  2021-Jan    100
13  2021-Feb    200
14  2021-Mrz    300
15  2021-Apr    100
16  2021-Mai    200
17  2021-Jun    300
18  2021-Jul    100
19  2021-Aug    200
20  2021-Sep    300

我想要得到的是一个新的数据框,其中 df2 中的每个月与 df1 中的相应月份之间存在差异。它应该是这样的

输出

    date    value
0   2020-Jan    -100
1   2020-Feb    0
2   2020-Mrz    0
3   2020-Apr    -200
4   2020-Mai    -200
5   2020-Jun    -100
6   2020-Jul    -400
7   2020-Aug    -300
8   2020-Sep    -300
9   2020-Okt    -500
10  2020-Nov    -500
11  2020-Dez    -400
12  2021-Jan    -100
13  2021-Feb    0
14  2021-Mrz    0
15  2021-Apr    -200
16  2021-Mai    -200
17  2021-Jun    -100
18  2021-Jul    -400
19  2021-Aug    -300
20  2021-Sep    -300

随着 df2 随着时间的推移变得越来越大(当 10 月、11 月、12 月的值出现时),我希望有一个无论 df2 中的行数是多少都能继续工作的解决方案。我想知道是否有办法从 df2 的前十二行中减去 df1,然后从第 13 行及以下行重新开始。

(很明显,在真实数据中,数字并不是像本例那样均匀分布的)

new_col = df2['value'].sub(df2['date'].str.split('-').str[-1].map(dict(zip(df1['date'].str.split('-').str[-1], df1['value']))))

输出:

>>> new_col
0    -100
1       0
2       0
3    -200
4    -200
5    -100
6    -400
7    -300
8    -300
9    -500
10   -500
11   -400
12   -100
13      0
14      0
15   -200
16   -200
17   -100
18   -400
19   -300
20   -300
dtype: int64