制定第一个活动和最后一个活动

时间:2018-05-14 09:21:36

标签: python pandas datetime dataframe events

我正在处理一些带有日期时间的事件数据。每个事件 gsm_id 列都有一个ID。对于每个活动,都有一个开始日期和时间 matchdatetime 列。将会有多个事件发生并由列 eventdatetime 列表示。还有一列记录 PreviousEventTime 列。如何创建新列以记录以下内容:1)每个" gsm_ID的第一个事件,其中 matchdatetime 列和 PreviousEventTime 列相同2)每个 gsm_id 的最后一个事件,其中" eventdatetime"是最新的。

    gsm_id   eventdatetime  matchdatetime   PreviousEventTime
    2462794 8/11/2017 18:46 8/11/2017 18:45 8/11/2017 18:45
    2462794 8/11/2017 18:49 8/11/2017 18:45 8/11/2017 18:46
    2462794 8/11/2017 19:13 8/11/2017 18:45 8/11/2017 18:49
    2462794 8/11/2017 19:31 8/11/2017 18:45 8/11/2017 19:13
    2462794 8/11/2017 19:40 8/11/2017 18:45 8/11/2017 19:31
    2462794 8/11/2017 20:07 8/11/2017 18:45 8/11/2017 19:40
    2462794 8/11/2017 20:09 8/11/2017 18:45 8/11/2017 20:07
    2462796 8/12/2017 14:23 8/12/2017 14:00 8/12/2017 14:00
    2462796 8/12/2017 14:38 8/12/2017 14:00 8/12/2017 14:23
    2462796 8/12/2017 14:42 8/12/2017 14:00 8/12/2017 14:38
    2462796 8/12/2017 15:08 8/12/2017 14:00 8/12/2017 14:42
    2462796 8/12/2017 15:27 8/12/2017 14:00 8/12/2017 15:08
    2462795 8/12/2017 17:39 8/12/2017 16:30 8/12/2017 16:30
    2462795 8/12/2017 17:44 8/12/2017 16:30 8/12/2017 17:39

任何人都可以建议如何锻炼吗? 如果您想加载该文件,请下载以下文件:

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

2 个答案:

答案 0 :(得分:1)

您可以使用:

In [203]: s1 = df[df['PreviousEventTime'] == df['matchdatetime']].groupby('gsm_id')['eventdatetime'].first()

In [204]: s1
Out[204]: 
gsm_id
2462794   2017-08-11 18:46:00
2462795   2017-08-12 17:39:00
2462796   2017-08-12 14:23:00
Name: eventdatetime, dtype: datetime64[ns]

In [205]: s2 = df.groupby('gsm_id')['eventdatetime'].last()

In [206]: s2
Out[206]: 
gsm_id
2462794   2017-08-11 20:09:00
2462795   2017-08-12 17:44:00
2462796   2017-08-12 15:27:00
Name: eventdatetime, dtype: datetime64[ns]

最后:

df.set_index('gsm_id').assign(myfirst=s1, mylast=s2).reset_index()

答案 1 :(得分:1)

您可以将pandas groupby对象用于这两个问题。

问题1)

import pandas as pd
data = pd.read_csv('Data_test.csv')

首先找到matchdatetime和PreviousEventTime相等的索引,然后按" gsm_id"分组。最后由"第一个"聚合功能:

first_equal_dates = df[df['PreviousEventTime'] == df['matchdatetime']].groupby('gsm_id')['eventdatetime'].first()

然后,您可以在原始数据框上合并/加入此内容。

问题2)

再次只是groupby" gsm_id",但是使用" last"功能改为:

import pandas as pd
data = pd.read_csv('Data_test.csv')
last_event_dates = data.groupby('gsm_id').agg({'eventdatetime': 'last'})

如果您希望将其作为数据框中的列,请再次将其合并/加入原始数据框。

您也可以将结果分配为一行:

data.set_index('gsm_id').assign(question_1=first_equal_dates, mylast=last_event_dates).reset_index()