计算数据帧中自重置事件以来的累积

游客

我有一个这样的数据框:

df = pd.DataFrame({'runner':[1,1,1,2,2,2],'date':['2017-04-01','2018-04-20','2018-05-25','2015-04-05','2015-10-20','2016-11-29'],'cum_distance':[100,125,130,10,20,50],'reset_event':[1,0,1,1,1,0]})

    runner  date        cum_distance    reset_event
0   1       2017-04-01  100             1          
1   1       2018-04-20  125             0          
2   1       2018-05-25  130             1          
3   2       2015-04-05  10              1          
4   2       2015-10-20  20              1          
5   2       2016-11-29  50              0          

数据已按跑步者分组并按日期排序。'cum_distance' 是总累积距离。

我想计算自重置点以来每个跑步者的累计距离:

    runner  date        cum_distance    reset_event runner_dist_since_reset
0   1       2017-04-01  100             1           100
1   1       2018-04-20  125             0           25
2   1       2018-05-25  130             1           30
3   2       2015-04-05  10              1           10
4   2       2015-10-20  20              1           10
5   2       2016-11-29  50              0           30

我如何进行这样的计算?为了更容易理解,您可以将“runner”视为汽车,将“reset_event”视为加油。我需要计算自上次加油以来的距离。

游客

好的,最后我设法解决了我的问题。以下是步骤:

如果第一名的行不是从 0 开始,您将必须添加 cum_distance = 0 的虚拟行以进行正确计算。您可以稍后删除它:

#unique runners ids
idx = np.unique(df.runner.values, return_index=1)[1]

for i in idx:  
    if df.loc[i,'cum_distance']!=0:
        df.loc[df.shape[0]]=[df.loc[i,'runner'],pd.to_datetime('1900-01-01'),0,0] #adding a row

df.sort_values(['runner', 'date'], ascending=[True, True],inplace=True)        

df = df.reset_index(drop=True)#reset index

计算每一行的距离差异(用 cum_distance 填充的第一行 NaN):

df['runner_dist_since_reset'] = df.groupby('runner')['cum_distance'].diff().fillna(df['cum_distance'])

输出:

    runner  date        cum_distance  reset_event   runner_dist_since_reset
0   1       2017-04-01  100           1             100.0
1   1       2018-04-20  125           0             25.0
2   1       2018-05-25  130           1             5.0
3   2       2015-04-05  10            1             10.0
4   2       2015-10-20  20            1             10.0
5   2       2016-11-29  50            0             30.0

使用 reset_event 标签作为时钟复位:

df.loc[:, 'runner_dist_since_reset'] = df.groupby(['runner', df['reset_event'].shift().cumsum()])['runner_dist_since_reset'].cumsum().fillna(df['cum_distance'])

输出:

    runner  date        cum_distance  reset_event   runner_dist_since_reset
0   1       2017-04-01  100           1             100.0
1   1       2018-04-20  125           0             25.0
2   1       2018-05-25  130           1             30.0
3   2       2015-04-05  10            1             10.0
4   2       2015-10-20  20            1             10.0
5   2       2016-11-29  50            0             30.0

Yatu,感谢您向我展示了“cumsum”功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章