我有一个很大的 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)
但填充在新列中的前一年值似乎不准确,因为一些没有前一年历史记录的项目正在填充销售值。感谢您的帮助!
答案 0 :(得分:0)
通过修改这行代码,我得到了想要的结果:
df['LastYear'] =
df.groupby([df['week_of_year'],df['date'].dt.year,df['storeNbr'],
df['itemNbr']],sort=False)['Sales'].shift(-1)
为此,从 groupby 中删除年份并将 shift 更改为 1 而不是 -1:
df['LastYear'] =
df.groupby([df['week_of_year'],df['storeNbr'],
df['itemNbr']],sort=False)['Sales'].shift(1)