首页 > 解决方案 > 在 Pandas 中按 ID 分组的数据框中减去每年的连续行

问题描述

我有一个数据框(mydf),其中按月 YTD 格式按 ID 组织销售额。仅显示一个组/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)

标签: pythonpandas

解决方案


要获得年度差异,您可以从日期创建一个新列年份。

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

推荐阅读