计算自复位事件以来的数据帧累积

时间:2019-01-11 11:27:48

标签: python pandas

我有一个像这样的数据框:

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

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

1 个答案:

答案 0 :(得分:0)

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

如果第一名的行不以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

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

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”功能。