Pandas按ID和年份分组对DataFrame连续行求差值拆分YTD月度销售
问题背景
现有名为mydf的DataFrame,存储按ID分组的月度YTD格式销售数据,示例仅展示1个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
需求目标
同一ID、同一年份的分组内:
- 每年第一个月的销售数值保持不变
- 其余月份的销售数值减去上一行的YTD销售额,得到当月实际销售额
预期输出结果如下:
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
现有问题
当前编写的代码仅按ID分组计算差值,无法实现按年份拆分的需求:
mydf['dif'] = mydf.groupby('ID')['Sales'].diff(1)
解决方法
你需要将ID和年份同时作为分组键,保证差值计算只在同一个ID、同一年的范围内生效,最后将每年首行diff产生的空值用原Sales值填充即可:
- 首先确保Date列为日期类型(如果已经是日期类型可跳过第一步)
- 按ID+年份分组计算差值,空值填充原销售额
# 转换日期类型 mydf['Date'] = pd.to_datetime(mydf['Date']) # 按ID+年份分组计算差值 mydf['dif'] = mydf.groupby(['ID', mydf['Date'].dt.year])['Sales'].diff().fillna(mydf['Sales'])
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

