亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何迭代 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條經驗 獲得超4個贊

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 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號