我有以下数据:
Date Qty
01/01/2019 4.15
02/01/2019 12.39
03/01/2019 14.15
04/01/2019 12.15
05/01/2019 3.26
06/01/2019 6.23
07/01/2019 15.89
08/01/2019 5.55
09/01/2019 12.49
10/01/2019 9.4
11/01/2019 9.11
12/01/2019 9.18
13/01/2019 13.45
14/01/2019 4.52
15/01/2019 0
16/01/2019 0
17/01/2019 8.41
18/01/2019 9.55
19/01/2019 15.43
20/01/2019 16.45
21/01/2019 9.28
22/01/2019 9.55
23/01/2019 7.87
24/01/2019 12.58
25/01/2019 6.12
26/01/2019 6.15
27/01/2019 6.07
28/01/2019 15.53
我想要实现的输出是这样:
Date Window_Sum
01/01/2019
02/01/2019
03/01/2019
04/01/2019
05/01/2019
06/01/2019
07/01/2019
08/01/2019
09/01/2019
10/01/2019
11/01/2019 100.62
12/01/2019 109.8
13/01/2019 110.86
14/01/2019 101.23
15/01/2019 101.23
16/01/2019 101.23
17/01/2019 109.64
18/01/2019 103.78
19/01/2019 112.98
20/01/2019 107.99
21/01/2019 104.78
22/01/2019 104.93
23/01/2019 103.69
24/01/2019 107.09
25/01/2019 113.21
26/01/2019 101.39
27/01/2019 107.46
28/01/2019 105.03
让我简要解释一下获取输出的逻辑: 因此,在01/01/2019上,“数量”为4.15,并且回头看没有其他值,因此累加总和不大于100。因此,输出值为NULL。
快进至2019年10月1日,数量为9.4,回顾累计金额为95.66。由于累计总和不大于100,因此输出将为NULL值。
接下来,我们将看11/01/2019。这里的数量是9.11,回头看,累计和是100.62。之所以是100.62而不是104.77是因为从11/01/2019到02/01/2019的数量总和(向后看)首先达到100 /略高于100。
类似地,在2019年12月1日,此处的数量为9.18,而回溯累计总和为100.8,因为从12/01/2019到02/01/2019的数量总和(向后看)命中100 /略高于100。
是否有一种解决方案,允许循环进入熊猫滚动总和函数以实现此结果?
我要在此处实现的目的是确保一旦累计总和达到100或稍微超过100,那么我将采用该值并将其附加到“ Window_Sum”中。
更新:进行管理以使代码在帮助下运行。解决方法如下:
#get last row index
start=len(data)-1
#initialise cumulative sum
cumsum = 0
for i in range(start,-1,-1):
j=i
while cumsum < 100:
cumsum += data.loc[j,'Qty']
if j!=0:
j-=1
else:
cumsum=None
break
data.loc[i,'Window_Sum']=cumsum
cumsum=0
答案 0 :(得分:0)
只需使用cumsum()
函数:
In [7]: df['Window_Sum'] = df['Qty'].cumsum()
In [8]: df.head()
Out[8]:
Date Qty Window_Sum
0 01-Jan-19 4.0 4.0
1 02-Jan-19 1.0 5.0
2 03-Jan-19 6.0 11.0
3 04-Jan-19 3.0 14.0
4 05-Jan-19 3.0 17.0
希望这就是您想要的!