Python Pandas对数据帧子集

时间:2018-05-24 06:01:55

标签: python pandas rolling-sum

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

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

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月份没有“回顾”期间可以获得正确的滚动总和值。

2 个答案:

答案 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