我有一个数据框,其中的一列由日期时间值组成,一列由速度值组成,一列由行之间的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
答案 0 :(得分:1)
您可以使用"How to groupby consecutive values in pandas DataFrame"中的方法来获取flag
是1
或0
的组,然后只需要应用{{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