如何在熊猫中互相减去两列列表?

时间:2020-09-06 23:12:30

标签: python arrays pandas numpy text

我在以制表符分隔的值文本文件中有如下数据:

FileName    Onsets          Offsets
FileName1   [9, 270, 763]   [188, 727, 1252]
FileName2   [52, 634, 1166, 1775, 2104] [472, 1034, 1575, 1970, 2457]
FileName3   [180, 560, 1332, 1532]  [356, 1286, 1488, 2018]

这些是来自音频文件的数据。每行包含我正在研究的每种声音的一系列开始和偏移时间。

在第一行数据中,9是第一声音的开始时间,188是第一声音的偏移时间。这意味着它持续了179毫秒。

我需要每种声音的持续时间,以及每种声音之间的沉默间隔。

目前,我按如下方式读取数据:

import pandas as pd
import numpy as np

data = pd.read_csv('/path/file.txt', delimiter='\t')
    
FileName = data[["FileName"]].to_numpy()  
Onsets = data[["Onsets"]].to_numpy()  
Offsets = data[["Offsets"]].to_numpy() 

那给了我三个numpy数组。对于起始和偏移,实际上每一行都是原始数据文件中数字的数组。

我可以使用什么代码来提取这些数字,以便从偏移时间中减去开始时间来确定持续时间?

1 个答案:

答案 0 :(得分:2)

  • 第一个问题是,您必须使用ast.literal_eval
  • 将必须转换为列表的字符串列
  • 为了执行数组减法,请将'Onsets''Offsets'中的值转换为numpy.arrays
  • 要计算沉默的差距:
    • [9, 270, 763][188, 727, 1252]之间的第一个沉默间隔始于188,结束于270
    • 要执行数组计算,请从Offsets的后两个元素中减去Onsets的前两个元素
      • 270 - 188763 - 727
      • x[0][1:]只是Onsets的第一个元素
      • x[1][:-1]只是Offsets的最后一个元素
import pandas as pd
import numpy as np
from ast import literal_eval

# load data and use literal_eval to converts strings to lists
data = pd.read_csv('/path/file.txt', delimiter='\t', converters={'Onsets': literal_eval, 'Offsets': literal_eval})

# convert rows of lists to numpy arrays
data[['Onsets', 'Offsets']] = data[['Onsets', 'Offsets']].applymap(np.array)

# subtract the values in the arrays
data['duration'] = data.Offsets.sub(data.Onsets)  # data.Offsets - data.Onsets can also be used

# calculate the gaps of silence
data['gaps'] = data[['Onsets', 'Offsets']].apply(lambda x: x[0][1:] - x[1][:-1], axis=1)

# display(data)
    FileName                       Onsets                        Offsets                   duration                  gaps
0  FileName1                [9, 270, 763]               [188, 727, 1252]            [179, 457, 489]              [82, 36]
1  FileName2  [52, 634, 1166, 1775, 2104]  [472, 1034, 1575, 1970, 2457]  [420, 400, 409, 195, 353]  [162, 132, 200, 134]
2  FileName3       [180, 560, 1332, 1532]        [356, 1286, 1488, 2018]       [176, 726, 156, 486]         [204, 46, 44]