为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2023-10-11 16:16:47
我有以下数据帧,其中一列表示对话中每一秒说话者的 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'])
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

使用以下代码:


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  end

0      4    7

1     12   15


查看完整回答
反对 回复 2023-10-11
?
守着一只汪

TA贡献1872条经验 获得超3个赞

import pandas as pd

from itertools import groupby



myDF = 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'] == 1

for 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  end

0      4    7

1     12   15


查看完整回答
反对 回复 2023-10-11
  • 2 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信