最好通过一个例子来解释。
我有以下数据框(每行可以被认为是一个事务):
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月份没有“回顾”期间可以获得正确的滚动总和值。
答案 0 :(得分:0)
您可以使用timedelta过滤您的df并保留1月的最后一天。
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)
答案 1 :(得分: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