[英]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 ID
和link ID
兩個連續行代表該link ID
的對象的開始和結束。 對象最終在鏈接處結束,該鏈接由出現在對象記錄末尾的單個鏈接ID表示。
這是所需的輸出。 將一個對象訪問一個鏈接的開始記錄和結束記錄壓縮為一個記錄。 對於每一個對象的結束鏈接,只需填寫StartTime
的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
注意:
無法保證一個對象不會兩次進入同一鏈接。 但是每次訪問鏈接都需要單獨記錄。
由於數據集非常大,我實現的一個幼稚的循環解決方案內存不足。
編輯 :我編輯了數據集以包括我的“注釋”第一點中提到的情況。
讓我們嘗試一下:
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.