【问题标题】:Create Pandas DF column based on values from an exiting column根据现有列中的值创建 Pandas DF 列
【发布时间】: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 制作具有递减年份的副本,然后加入dateweek_of_yearstoreNbrHere is how to restrict the join on a subset of the date.
  • 感谢您指出这一点。我能够使用@HenryEcker 建议并从 groupby 中删除年份并移动 1 而不是 -1 来获得所需的结果。
  • 我很高兴你可以让它工作。您能否提供您的解决方案作为您自己问题的答案,以便其他人受益?

标签: python pandas


【解决方案1】:

通过修改这行代码,我能够得到想要的结果:

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)

【讨论】:

  • 移位值应该是 -1,而不是 1。此外,您可以只使用 groupby 中的列名:df.groupby(['week_of_year', 'storeNbr', 'itemNbr'], sort=False)。另外,请注意您的格式,您的代码目前是多行的,如果复制粘贴将无法工作。
猜你喜欢
  • 1970-01-01
  • 2018-10-07
  • 2023-01-23
  • 2021-10-07
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多