【问题标题】:Calculate accumulation since reset event in a Data Frame计算自数据帧中重置事件以来的累积
【发布时间】:2019-06-06 07:43:59
【问题描述】:

我有一个这样的数据框:

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”视为加油。我需要计算自上次加油后的距离。

【问题讨论】:

  • 你确定这是正确的吗?第 3 行应该是 -120 吗?
  • 自重置后更正了第 2 行距离:30 (130 - 100)。谢谢。
  • 那我不明白......所以在每个重置点之后你会做的IMO(例如最后一行):最后一行(50-20),(20-10)之前的一个和(10-130)之前的一个。第一个应该是130,就像第1行是100一样。你能帮我理解吗
  • 亚图,请注意有不同的跑步者。你的逻辑没问题,但我想计算每个跑步者的进度。
  • 嗯,我明白了。刚刚离开,给我一点时间,我会试着用你刚刚告诉我的来解决

标签: python pandas


【解决方案1】:

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

如果第一个跑步者的行不是以 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”函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2017-11-28
    • 2021-04-23
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多