通过使用pandas将现有列向下移动到1行来创建新列

时间:2018-05-09 02:54:01

标签: python pandas

我正在从事体育运动。 目的是在游戏中记录当前的eventdatetime和PreviousEventTime。我在下面的链接中有一个示例数据集。

https://drive.google.com/open?id=1DUNrWPFwrkZHpq_KeA4rZCJ94sbpUEDI

在此文件中,有11列。该活动是根据时间收集的。 对于此重新安排,我将使用以下列   gsm_ID eventdatetime

我想创建一个新列 PreviousEventTime ,该列占用 eventdatetime 列的n-1行。 这意味着对于每个 gsm_ID ,都会有第一个 eventdatetime 。 与时间列相比,新列将表示下一个事件时间。

gsm_ID eventdatetime PreviousEventTime

  

2462794 08/11/2017 18:46 08/11/2017 18:45

     

2462794 08/11/2017 18:49 08/11/2017 18:46

     

2462794 08/11/2017 19:13 08/11/2017 18:49

     

2462794 08/11/2017 19:31 08/11/2017 19:13

     

2462794 08/11/2017 20:09 08/11/2017 19:31

     

2462795 08/12/2017 17:39 08/12/2017 16:30

     

2462795 08/12/2017 17:44 08/12/2017 17:39

以上示例仅适用于两场比赛。您可以通过 gsm_id 进行区分。 PreviousEventTime的for行始终为 matchdatetime。 我将有100场比赛。但是这个过程将重复上述例子。

  

eventdata ['PreviousEventTime-1'] = eventdata.groupby(['gsm_id'])['eventdatetime'].shift(-1)

但它仅适用于第一个 gsm_ID 。它不适用于其他 gsm_ID 。 上面脚本的输出如下:

  

enter image description here

非常感谢您的建议。 问候, 和风

1 个答案:

答案 0 :(得分:0)

正确排序解决了问题。 我在下面的排序和索引中添加了:

  

eventdata = eventdata.set_index(['gsm_id']) .sort_index(ascending =True)

     

eventdata=eventdata.sort_values(['matchdatetime','time'],ascending=[True,True])

     

eventdata ['PreviousEventTime-1'] = eventdata.groupby(['gsm_id','matchdatetime'])['eventdatetime'].shift(1, axis = 0)

但剩下的部分是用 matchdatetime 来填充NaT。 谢谢大家的建议。 问候 和风