Рассчитать накопление с момента сброса события в фрейме данных - PullRequest
0 голосов
/ 11 января 2019

У меня есть такой фрейм данных:

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 голосов
/ 14 января 2019

Хорошо, наконец-то мне удалось решить мою проблему. Вот шаги:

Если строка первого бегуна не начинается с 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

Рассчитать расстояние diff для каждой строки (первый ряд 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'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...