python - 在 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)
解决方案
要获得年度差异,您可以从日期创建一个新列年份。
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
推荐阅读
- javascript - 使用 Javascript 在列表元素中的文本之后添加一个字符,但在缩进列表之前,并且文本和添加之间没有空格
- sift - 我们如何将 Mobilenetv2 和 VGG16 等预训练模型与 BoVW、SIFT 和 Fisher Vector 相结合来优化提取的特征?
- python - 如何通过忽略两者之间的字符来仅过滤那些在DataFrame中包含所需字符串的记录
- generative-adversarial-network - ValueError:没有为具有 Tap.gradiant 的 GanModel 中的任何变量提供梯度
- fpga - 在没有串行端口的情况下查看 Microblaze 处理器输出
- javascript - 在reactjs中打开录制时切换音频和视频设备
- emoji - 图像如何转换为 bitmoji?
- r - 元分析:将森林图输出转换为百分比
- python - 找不到 Python 站点包的用户站点目录
- c# - 希望避免在复杂的只读类(游戏状态)中返回可写引用