如何在指定日期范围内对Pandas列DataFrame中的特定值进行求和

4
我有一个类似如下的大型数据框: df =
    UPC   Unit_Sales  Price   Price_Change  Date 
 0   22          15    1.99         NaN     2017-10-10
 1   22          7     2.19         True    2017-10-12
 2   22          6     2.19         NaN     2017-10-13
 3   22          7     1.99         True    2017-10-16
 4   22          4     1.99         NaN     2017-10-17
 5   35          15    3.99         NaN     2017-10-09
 6   35          17    3.99         NaN     2017-10-11
 7   35          5     4.29         True    2017-10-13
 8   35          8     4.29         NaN     2017-10-15
 9   35          2     4.29         NaN     2017-10-15

基本上,我试图记录产品(UPC)的销售在价格改变后的7天内如何反应。我想创建一个新列['Reaction'],记录从价格改变的那一天开始,向前7天的单位销售总和。请注意,有时一个UPC可能有多于2次的价格变动,因此我希望每个价格变动都有不同的总和。所以我想看到这个:
    UPC   Unit_Sales  Price   Price_Change  Date        Reaction
 0   22          15    1.99         NaN     2017-10-10      NaN
 1   22          7     2.19         True    2017-10-12      13   
 2   22          6     2.19         NaN     2017-10-13      NaN
 3   22          7     1.99         True    2017-10-16      11
 4   22          4     1.99         NaN     2017-10-19      NaN
 5   35          15    3.99         NaN     2017-10-09      NaN
 6   35          17    3.99         NaN     2017-10-11      NaN
 7   35          5     4.29         True    2017-10-13       15
 8   35          8     4.29         NaN     2017-10-15      NaN
 9   35          2     4.29         NaN     2017-10-18      NaN

“日期设置在我的数据中是困难的。有时(例如对于UPC 35),日期不会超过7天。因此,我希望它默认为下一个最近的日期,或者有多少个日期(如果少于7天)。
这是我尝试过的: 我将日期设置为datetime,然后通过.days方法计算天数。 这是我想要设置代码的方式(初稿):”
  x = df.loc[df['Price_Change'] == 'True']
  for x in df: 
       df['Reaction'] = sum(df.Unit_Sales[1day :8days])

有没有更简单的方法来做这件事,也许不需要用for循环?

你能更清晰地解释一下如何得到你的预期输出吗? - cs95
是的,抱歉没有表达得更清楚。24是通过将第1行到第4行的单位销售总和计算出来的,这些数据在我想要的7天日期范围内。同样,15是通过添加第7行到第9行的单位销售量计算出来的。 - Hana
我正在计算每个UPC在价格更改后的单位销售总和,最多持续7天窗口期内。 - Hana
1个回答

2

你只需要使用 groupbyffill

df.loc[df.Price_Change==True,'Reaction']=df.groupby('UPC').apply(lambda x : (x['Price_Change'].ffill()*x['Unit_Sales']).sum()).values
df
Out[807]: 
   UPC  Unit_Sales  Price Price_Change        Date  Reaction
0   22          15   1.99          NaN  2017-10-10       NaN
1   22           7   2.19         True  2017-10-12      24.0
2   22           6   2.19          NaN  2017-10-13       NaN
3   22           7   2.19          NaN  2017-10-16       NaN
4   22           4   2.19          NaN  2017-10-17       NaN
5   35          15   3.99          NaN  2017-10-09       NaN
6   35          17   3.99          NaN  2017-10-11       NaN
7   35           5   4.29         True  2017-10-13      15.0
8   35           8   4.29          NaN  2017-10-15       NaN
9   35           2   4.29          NaN  2017-10-15       NaN

更新

df['New']=df.groupby('UPC').apply(lambda x : x['Price_Change']==True).cumsum().values

v1=df.groupby(['UPC','New']).apply(lambda x : (x['Price_Change'].ffill()*x['Unit_Sales']).sum())

df=df.merge(v1.reset_index())

df[0]=df[0].mask(df['Price_Change']!=True)
df
Out[927]: 
   UPC  Unit_Sales  Price Price_Change        Date  New     0
0   22          15   1.99          NaN  2017-10-10    0   NaN
1   22           7   2.19         True  2017-10-12    1  13.0
2   22           6   2.19          NaN  2017-10-13    1   NaN
3   22           7   1.99         True  2017-10-16    2  11.0
4   22           4   1.99          NaN  2017-10-17    2   NaN
5   35          15   3.99          NaN  2017-10-09    2   NaN
6   35          17   3.99          NaN  2017-10-11    2   NaN
7   35           5   4.29         True  2017-10-13    3  15.0
8   35           8   4.29          NaN  2017-10-15    3   NaN
9   35           2   4.29          NaN  2017-10-15    3   NaN

哦,这太棒了!对吧,@Peter,我注意到了,谢谢。但这是一个不错的开始。 - Hana
@Wen,哦,是的,这绝对是可能的。有没有一种方法可以为一个UPC的新价格更改启动新的总和? - Hana
@Wen 我似乎无法弄清楚,如果你能帮忙就告诉我一声。每当我尝试修改代码时,都会得到上述相同的错误。 - Hana
@Hana,最好在你的样本数据中包含特殊情况(一个UTC有两个以上的True)。 - BENY
我编辑了我的问题!我让第一个UPC有两个价格更改。因此,我想看到每个价格更改的新总和 @Wen - Hana
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接