1

这最好通过一个例子来解释。

我有以下数据框(每一行都可以被认为是一个事务):

DATE        AMOUNT
2017-01-29  10 
2017-01-30  20
2017-01-31  30
2017-02-01  40
2017-02-02  50
2017-02-03  60

我想计算 2 天的滚动总和,但仅适用于 2 月份的行。

我目前拥有的代码片段:

df.set_index('DATE',inplace=True)

res=df.rolling('2d')['AMOUNT'].sum()

这使:

            AMOUNT 
2017-01-29  10 
2017-01-30  30 
2017-01-31  50 
2017-02-01  70 
2017-02-02  90 
2017-02-03  110

但我真的只需要最后3行的输出,前3行的操作是不必要的。当数据帧很大时,这会产生巨大的时间复杂度。如何仅计算最后 3 行的滚动总和(除了计算所有行的滚动总和,然后执行行过滤操作)?

*我也无法预先过滤数据框,因为 1 月份不会有“回溯”期来获得正确的滚动总和值。

4

2 回答 2

0

您可以使用 timedelta 过滤您的 df 并保留一月的最后一天。

import datetime  

dateStart = datetime.date(2017, 2, 1) - datetime.timedelta(days=1)
dateEnd = datetime.date(2017, 2, 3)
df.loc[dateStart:dateEnd]

然后您可以进行滚动操作并删除第一行(即 2017-01-31)

于 2018-05-24T07:14:25.093 回答
0

您可以使用仅计算最后一行的滚动总和tail(4)

res = df.tail(4).rolling('2d')['AMOUNT'].sum()

输出:

DATE
2017-01-31      NaN
2017-02-01     70.0
2017-02-02     90.0
2017-02-03    110.0
Name: AMOUNT, dtype: float64

如果您想合并这些值 - 不包括 2017-01-31,那么您可以执行以下操作:

df.loc[res.index[1:]] = res.tail(3)

输出:

            AMOUNT
DATE    
2017-01-29  10.0
2017-01-30  20.0
2017-01-31  30.0
2017-02-01  70.0
2017-02-02  90.0
2017-02-03  110.0
于 2018-05-24T11:33:20.133 回答