首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何迭代Pandas数据帧中的多个列?

如何迭代Pandas数据帧中的多个列?
EN

Stack Overflow用户
提问于 2020-10-07 03:49:14
回答 2查看 129关注 0票数 0

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

代码语言:javascript
运行
复制
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语音片段的开始和结束,其中每一行都是一个不间断的语音周期。如下所示:

代码语言:javascript
运行
复制
--------------------------------
  start              end       
--------------------------------
    4                 7        
    12                15
--------------------------------

我有一些不能工作的伪代码,希望能勾勒出我试图实现的目标,但到目前为止,我还找不到正确的解决方案。实际上,对于每一行,我将ID值与前一行进行比较(因为ID的变化表示语音的开始),并将相应的秒值添加到bdry dataframe。类似地,我将每个ID值与下一行进行比较(因为这将表示语音的结束)。

代码语言:javascript
运行
复制
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'])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-07 04:38:03

使用以下代码:

代码语言:javascript
运行
复制
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)

对于您的数据样本,结果为:

代码语言:javascript
运行
复制
   start  end
0      4    7
1     12   15
票数 1
EN

Stack Overflow用户

发布于 2020-10-07 04:07:12

代码语言:javascript
运行
复制
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)

打印:

代码语言:javascript
运行
复制
   start  end
0      4    7
1     12   15
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64232860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档