Python/ Pandas : Merging Consecutive Rows Only if Matching Columns

标签 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

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

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

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

注意:

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

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

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

最佳答案

让我们试试这个:

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)

输出:

    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      

关于Python/ Pandas : Merging Consecutive Rows Only if Matching Columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44373668/

相关文章:

python - Matplotlib:在同一轴位置显示次要刻度和主要刻度

python - pandas - 将频率较高的 DataFrame 下采样到频率较低的 DataFrame

Python 子进程给出语法错误但从 shell 运行

python - 添加两个字典以按数组列出

Python Crawler Beatifulsoup decompose() 函数

不带 distutils.version 的 Python 版本列表

python - 在 Python 中将表/数据框与公共(public)列连接起来

python - 如何在两个数据框中查找相同的列名并组合匹配的列

python - 使用每月日期计算累积流失率 - 日期问题很重要

python - 错误 :cannot convert float NaN to integer in pandas