簡體   English   中英

Python / Pandas:僅當匹配列時才合並連續的行

[英]Python/Pandas: Merging Consecutive Rows Only if Matching Columns

我有一個龐大的數據集,其中包含在網絡中傳播的對象的記錄。 該數據集存儲在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兩個連續行代表該link 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      
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'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM