我有一个这样的数据框:
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] 删除。
我来说两句