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
我有两个这样的数据框
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