【发布时间】:2021-09-19 10:22:23
【问题描述】:
我有一个大 df 显示项目级别的项目销售额。一年中的每个星期都会发生销售,并有相应的日期(并非所有项目在一年中的每个星期都有销售)。 Df 看起来像这样:
date week_of_year itemNbr itemDesc storeNbr Sales
2021-06-29 23 1234 shampoo 123 100
2021-07-06 24 1234 shampoo 123 500
2021-07-09 25 1234 shampoo 180 0
2020-07-10 24 1234 shampoo 123 50
2020-01-05 1 1325 bowl 129 10
2019-01-01 1 1325 bowl 129 100
我需要一列显示一年前同一时间(一年中的一周)在同一商店编号的商品销售情况。所以它应该是这样的:
date week_of_year itemNbr itemDesc storeNbr Sales YearAgo
2021-06-29 23 1234 shampoo 123 100 NaN
2021-07-06 24 1234 shampoo 123 500 50
2021-07-09 25 1234 shampoo 180 0 NaN
2020-07-10 24 1234 shampoo 123 50 NaN
2020-01-05 1 1325 bowl 129 10 100
2019-01-01 1 1325 bowl 129 100 NaN
我尝试过类似的方法:
df['LastYear'] = df.groupby([df['week_of_year'],df['date'].dt.year,df['storeNbr'],
df['itemNbr']],sort=False)['Sales'].shift(-1)
但新列中填充的上一年值似乎不准确,因为一些没有上一年历史记录的项目正在填充销售值。我很感激这里的任何帮助!
【问题讨论】:
-
您已按
year分组。如果每一年都在一个单独的组中,groupby shift将无法为您提供上一年的值。因为groupby shift只会在组内移动值。 -
您可以使用
date制作具有递减年份的副本,然后加入date、week_of_year和storeNbr。 Here is how to restrict the join on a subset of the date. -
感谢您指出这一点。我能够使用@HenryEcker 建议并从 groupby 中删除年份并移动 1 而不是 -1 来获得所需的结果。
-
我很高兴你可以让它工作。您能否提供您的解决方案作为您自己问题的答案,以便其他人受益?