当不再满足条件时重置的累计和

时间:2019-10-23 10:40:00

标签: python pandas dataframe cumsum

我有一个数据框,其中的一列由日期时间值组成,一列由速度值组成,一列由行之间的timedelta值组成。

只要速度低于2节,我都希望获得timedelta的累积总和。当速度上升到2节以上时,我希望将此累计和重置为0,然后在低于2节的速度观测的下一个实例开始求和。

我首先标记了所有速度值<2的观测值。我只设法获得速度<2的所有观测值的累积和,而没有为每个实例分离一个累积和。

数据帧如下所示,cum_sum是所需的输出:

datetime            speed      timedelta     cum_sum     flag
1-1-2019 19:30:00    0.5           0            0          1
1-1-2019 19:32:00    0.7           2            2          1
1-1-2019 19:34:00    0.1           2            4          1
1-1-2019 19:36:00    5.0           2            0          0
1-1-2019 19:38:00    25.0          2            0          0
1-1-2019 19:42:00    0.1           4            4          1
1-1-2019 19:49:00    0.1           7            11         1

2 个答案:

答案 0 :(得分:1)

您可以使用"How to groupby consecutive values in pandas DataFrame"中的方法来获取flag10的组,然后只需要应用{{1 }}在cumsum列上,并将timedelta设置为flag == 0的那些值:

0

会给予

gb = df.groupby((df['flag'] != df['flag'].shift()).cumsum())
df['cum_sum'] = gb['timedelta'].cumsum()
df.loc[df['flag'] == 0, 'cum_sum'] = 0
print(df)

答案 1 :(得分:0)

注意 :使用全局变量

c = 0
def fun(x):
    global c    
    if x['speed'] > 2.0:
        c = 0
    else:
        c = x['timedelta']+c
    return c

df = pd.DataFrame( {'datetime': ['1-1-2019 19:30:00']*7,
    'speed': [0.5,.7,0.1,5.0,25.0,0.1,0.1], 'timedelta': [0,2,2,2,2,4,7]})

df['cum_sum']=df.apply(fun, axis=1)
            datetime    speed   timedelta   cum_sum
0   1-1-2019 19:30:00   0.5     0           0
1   1-1-2019 19:30:00   0.7     2           2
2   1-1-2019 19:30:00   0.1     2           4
3   1-1-2019 19:30:00   5.0     2           0
4   1-1-2019 19:30:00   25.0    2           0
5   1-1-2019 19:30:00   0.1     4           4
6   1-1-2019 19:30:00   0.1     7           11