如何迭代 Pandas 数据框中的多列?

我有以下数据帧,其中一列表示对话中每一秒说话者的 ID (0,1),另一列表示该对话中经过的秒数。


myDF = pd.DataFrame({'ID': [0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1], 'seconds': (np.arange(16))})


-------------------------------

   ID               Seconds

-------------------------------

   0                   0

   0                   1

   0                   2

   0                   3

   1                   4

   1                   5

   1                   6

   1                   7

   0                   8

   0                   9

   0                   10

   0                   11

   1                   12

   1                   13

   1                   14

   1                   15

-------------------------------

我只对说话者 ID 1 感兴趣,希望可以清楚地看出说话者 1 语音的边界在第 4-7 秒和第 12-15 秒之间。我想要生成的是一个单独的数据帧,其中包含每个说话者 1 个语音段的开始和结束,其中每一行都是一个不间断的语音周期。像这样的东西:


--------------------------------

  start              end       

--------------------------------

    4                 7        

    12                15

--------------------------------

我有一些不起作用的伪代码,希望概述我想要实现的目标,但到目前为止我还找不到正确的解决方案。本质上,对于每一行,我将 ID 值与前一行进行比较(因为 ID 的更改表示语音的开始),并将相应的秒值添加到 bdry 数据帧中。同样,我随后将每个 ID 值与下一行进行比较(因为这将表示语音结束)。


bdry = pd.DataFrame(columns=['start','end'])


for i in myDF:

    if i['ID'] == 1:

        if i.ID != i['ID'].shift(): # compare ID with previous

            bdry['start'].append(i['seconds'])

        if i.ID != i['ID'].shift(-1): # compare ID with next

            bdry['end'].append(i['seconds'])


暮色呼如
浏览 76回答 2
2回答

慕桂英546537

使用以下代码:result = myDF.groupby((myDF.ID != myDF.ID.shift()).cumsum()).agg(    ID=('ID', 'first'), start=('seconds', 'first'), end=('seconds', 'last'))\    .query('ID == 1').drop(columns='ID').reset_index(drop=True)对于您的数据样本,结果是:   start  end0      4    71     12   15

守着一只汪

import pandas as pdfrom itertools import groupbymyDF = pd.DataFrame({'ID': [0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1], 'seconds': (np.arange(16))})tmp, m = [], myDF['ID'] == 1for v, g in groupby(zip(m.index, m), lambda k: k[1]):    if v:        g = list(g)        tmp.append((g[0][0], g[-1][0]))df = pd.DataFrame(tmp, columns=['start', 'end'])print(df)印刷:   start  end0      4    71     12   15
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python