如何基于前一行合并数据帧中的行?

2024-10-02 02:36:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个按顺序排列的数据帧,它表示随时间测量的两个事件-测量值是事件的开始和结束时间。它们应该以abababab序列排序,但在某些情况下,我可能会有相同类型的连续事件(即ababababab)。我正在寻找一种方法,用上一个事件标签检查每一行中的事件标签(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,但没有任何成功。对于缺少代码表示歉意,但我不知道如何解决这个问题


Tags: 数据方法event类型排序方式时间事件
2条回答

您可以将^{}firstlast一起使用

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)

相关问题 更多 >

    热门问题