【问题标题】:Python/Pandas: Merging Consecutive Rows Only if Matching ColumnsPython / Pandas:仅在匹配列时合并连续行
【发布时间】:2017-06-06 01:27:40
【问题描述】:

我有一个大型数据集,其中包含在网络中传播的对象的记录。数据集存储在 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

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

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

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

注意:

  • 不能保证一个对象不会两次进入同一链接。但是每次访问链接都需要单独记录。

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

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    让我们试试这个:

    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      
    

    【讨论】:

    • 您好,我稍微编辑了数据,以包括一个对象两次通过同一链接的情况。这仍然适用于那个案例吗? (我也要去测试它。)谢谢你的回答。
    • 美丽。谢谢!
    • 这太棒了!
    • @A-Za-z 谢谢。
    • 我们能解释一下第一行代码是做什么的吗?
    【解决方案2】:
    df.drop_duplicates(subset = ['Obj ID','link ID'], 
        keep='first').merge(x.drop_duplicates(subset = ['Obj ID','link ID'], 
        keep='last'), on= ['Obj ID','link ID'])
    

    【讨论】:

    • 您好,我稍微编辑了数据,以包括一个对象两次通过同一链接的情况。这仍然适用于那个案例吗? (我也要去测试它。)谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2019-05-16
    相关资源
    最近更新 更多