簡體   English   中英

如何根據前一行合並數據框中的行?

[英]How to merge rows in a Dataframe based on a previous row?

我有一個按順序排列的數據幀,它表示隨時間測量的兩個事件 - 測量值是事件的開始時間和結束時間。 be ordered in an ABABAB sequence, but in some cases I may have consecutive events of the same type (ie ABABAABABB).它們按 ABABAB 序列排序,但在某些情況下,我可能有相同類型的連續事件(即 ABABAABABB)。 我正在尋找一種方法來檢查每一行中的事件標簽(A 或 B)與前一個事件標簽,如果它們相同,則以保持第一個事件的開始時間的方式合並行,並且第二個事件的結束時間。 考慮以下:

myDF = pd.DataFrame({"Event": ["A","B","A","A","B","B","A"], 
                 "Start": [1,3,5,7,9,11,13], 
                 "End": [2,4,6,8,10,12,14]})

我目前擁有的...

==============================
  Event      Start      End
==============================
    A          1         2
    B          3         4
    A          5         6
    A          7         8
    B          9         10
    B          11        12
    A          13        14
==============================

我需要的...

注意:索引位置 2-3 處的兩個 A 事件已合並為一個,就像最初位於位置 4-5 處的兩個 B 事件一樣。

==============================
  Event      Start      End
==============================
    A          1         2
    B          3         4
    A          5         8
    B          9         12
    A          13        14
==============================

我最初想使用groupby但我認為這不正確,因為這將對整個數據幀進行分組。 同樣,我嘗試使用iteritems但沒有任何成功。 為缺少代碼道歉,但我不知道如何解決這個問題。

您可以將GroupBy.aggfirstlast

g = df["Event"].ne(df["Event"].shift()).cumsum()
df.groupby(g, as_index = False).agg({
  "Event": "first",
  "Start": "first",
  "End": "last"
})

  Event  Start  End
0     A      1    2
1     B      3    4
2     A      5    8
3     B      9   12
4     A     13   14

另一種方式可以是

for i in range(1,myDF.shape[0]):
    if myDF['Event'][i] == myDF['Event'][i-1]:
        myDF.loc[i, ('Start')]= min(myDF['Start'][i],myDF['Start'][i-1])
        myDF.loc[i, ('End')]= max(myDF['End'][i],myDF['End'][i-1])
        myDF.drop([i-1],inplace=True)

暫無
暫無

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

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