在 Pandas 中按 ID 分组的数据框中减去每一年的连续行

时间:2021-07-20 15:58:41

标签: python pandas

我有一个数据框 (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)

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
相关问题