我有一个像这样的数据框:
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”视为加油。我需要计算自上次加油以来的距离。
答案 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”功能。