我有一个数据框 (mydf),其中包含按月 YTD 格式按 ID 组织的 Sales。仅显示一个组/ID 作为示例,但数据中包含多个此类 ID。
Date ID Sales
2020-01-01 B0118 63975
2020-02-01 B0118 114568
2020-03-01 B0118 202849
2020-04-01 B0118 280112
2020-05-01 B0118 336854
2020-06-01 B0118 377005
2020-07-01 B0118 437183
2020-08-01 B0118 517220
2020-09-01 B0118 589187
2020-10-01 B0118 632946
2020-11-01 B0118 701808
2020-12-01 B0118 766152
2021-01-01 B0118 57883
2021-02-01 B0118 99555
2021-03-01 B0118 190112
2021-04-01 B0118 289180
2021-05-01 B0118 338044
2021-06-01 B0118 373061
除了第一个月,我需要从每一行和前一行中扣除每年的销售额。例如,2020-02-01 的销售额应从上个月的销售额(2020-01-01)中扣除,依此类推,而 2020-01-01 的销售额应保持与第一个月的销售额相同.
例外的输出应如下所示:
Date ID Sales dif
2020-01-01 B0118 63975 63975
2020-02-01 B0118 114568 50593.0
2020-03-01 B0118 202849 88281.0
2020-04-01 B0118 280112 77263.0
2020-05-01 B0118 336854 56742.0
2020-06-01 B0118 377005 40151.0
2020-07-01 B0118 437183 60178.0
2020-08-01 B0118 517220 80037.0
2020-09-01 B0118 589187 71967.0
2020-10-01 B0118 632946 43759.0
2020-11-01 B0118 701808 68862.0
2020-12-01 B0118 766152 64344.0
2021-01-01 B0118 57883 57883
2021-02-01 B0118 99555 41672.0
2021-03-01 B0118 190112 90557.0
2021-04-01 B0118 289180 99068.0
2021-05-01 B0118 338044 48864.0
2021-06-01 B0118 373061 35017.0
首先,我正在尝试类似的东西,但我需要逐年差异:
mydf['dif'] = mydf.groupby('ID')['Sales'].diff(1)
答案 0 :(得分:0)
要获得年度差异,您可以从日期创建一个新的年份列。
df['Year'] = pd.to_datetime(df['Date']).dt.year
接下来就可以用ID和Year得到想要的结果了
df['diff'] = df.groupby(['ID', 'Year'])['Sales'].diff().fillna(df.Sales)
输出:
Date ID Sales Year diff
0 2020-01-01 B0118 63975 2020 63975.0
1 2020-02-01 B0118 114568 2020 50593.0
2 2020-03-01 B0118 202849 2020 88281.0
3 2020-04-01 B0118 280112 2020 77263.0
4 2020-05-01 B0118 336854 2020 56742.0
5 2020-06-01 B0118 377005 2020 40151.0
6 2020-07-01 B0118 437183 2020 60178.0
7 2020-08-01 B0118 517220 2020 80037.0
8 2020-09-01 B0118 589187 2020 71967.0
9 2020-10-01 B0118 632946 2020 43759.0
10 2020-11-01 B0118 701808 2020 68862.0
11 2020-12-01 B0118 766152 2020 64344.0
12 2021-01-01 B0118 57883 2021 57883.0
13 2021-02-01 B0118 99555 2021 41672.0
14 2021-03-01 B0118 190112 2021 90557.0
15 2021-04-01 B0118 289180 2021 99068.0
16 2021-05-01 B0118 338044 2021 48864.0
17 2021-06-01 B0118 373061 2021 35017.0