Python/Pandas:仅在匹配列时合并连续行

Kev*_* W. 3 python pandas

我有一个大型数据集,其中包含网络中移动的对象的记录。数据集存储在 pandas 数据集中,大致如下所示:

Obj ID | Timestamp | x | y | link ID
-------|-----------|---|---|---------
 123   |  506      |123|456|  ab12
 123   |  517      |129|436|  ab12
 123   |  519      |125|454|  cd34
 126   |  501      |123|426|  gk77
 126   |  505      |153|453|  gk77
 126   |  507      |129|856|  bj88
 126   |  508      |143|496|  bj88
 126   |  512      |125|427|  gk77
 126   |  515      |153|453|  gk77
 126   |  518      |127|256|  ab12
Run Code Online (Sandbox Code Playgroud)

数据帧已按 排序Obj ID,属于对象的每个记录块已按时间(Timestamp以秒为单位的字段)排序。具有相同 和 的两个连续行Obj ID表示link ID该链接的对象的开始和结束。该对象最终以一个链接结束,该链接由出现在对象记录末尾的单个链接 ID 表示。

这是所需的输出。将一个对象对一个链接的访问的起始记录和结束记录压缩为一条记录。对于每个对象的结束链接,只需填写StartTimefor EndTime

Obj ID | StartTime | EndTime | link ID
-------|-----------|---------|---------
 123   |  506      |   517   |  ab12
 123   |  519      |   519   |  cd34
 126   |  501      |   505   |  gk77
 126   |  507      |   508   |  bj88
 126   |  512      |   515   |  gk77
 126   |  518      |   518   |  ab12
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 无法保证一个对象不会在同一条链路上移动两次。但每次对链接的访问都需要单独记录。

  • 由于数据集非常大,我实现的简单循环解决方案耗尽了内存。

编辑:我编辑了数据集以包含我的“笔记”第一点中提到的情况。

Sco*_*ton 7

让我们试试这个:

g =(df['link ID'] != df.shift().fillna(method='bfill')['link ID']).cumsum().rename('group')

df.groupby(['Obj ID','link ID',g])['Timestamp'].agg(['min','max']).reset_index().rename(columns={'min':'StartTime','max':'EndTime'}).drop('group',axis=1)
Run Code Online (Sandbox Code Playgroud)

输出:

    Obj ID link ID    StartTime      EndTime
0   123       ab12    506          517      
1   123       cd34    519          519      
2   126       ab12    518          518      
3   126       bj88    507          508      
4   126       gk77    501          505      
5   126       gk77    512          515      
Run Code Online (Sandbox Code Playgroud)

  • 我们能解释一下第一行代码在做什么吗? (2认同)