【问题标题】:How to sum certain values in a pandas column DataFrame in a specific date range如何在特定日期范围内对 Pandas 列 DataFrame 中的某些值求和
【发布时间】:2018-01-26 23:32:15
【问题描述】:

我有一个大的 DataFrame,看起来像这样: 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 天)。

这是我尝试过的: 我将日期设置为日期时间,并且正在考虑通过 .days 方法计算天数。 这就是我正在考虑设置代码的方式(草稿):

  x = df.loc[df['Price_Change'] == 'True']
  for x in df: 
       df['Reaction'] = sum(df.Unit_Sales[1day :8days])

有没有更简单的方法来做到这一点,也许没有 for 循环?

【问题讨论】:

  • 您能否更清楚地解释一下您是如何获得预期输出的?
  • 是的,很抱歉没有更清楚。 24 是通过将第 1 行到第 4 行的单位销售额总和计算得出的,这在我想要的 7 天日期范围内。同样,15 是通过将第 7 行到第 9 行的单位销售额相加计算得出的。
  • 我正在计算价格变化后每个 UPC 的单位销售额总和,最多 7 天的窗口

标签: python pandas dataframe


【解决方案1】:

你只需要ffillgroupby

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

【讨论】:

  • 漂亮的单线!请注意,这将累加价格变化后的所有单位销售额,而不仅仅是(最多)价格变化后的接下来的 7 天。
  • 哦,这太棒了!对@Peter,我注意到了,谢谢。但这是一个好的开始。
  • 我也在我的 DataFrame 上试过这个并且我得到这个错误:
  • 'TypeError: ufunc 'multiply' 不包含签名匹配类型的循环 dtype('
  • 不太清楚这是什么意思
猜你喜欢
  • 2018-12-29
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多