我一直在运行一个算法来检测一些音频文件中的声音。结果数据集包含检测开始和结束的时间。但是,预测每3秒进行一次,我希望聚合数据集以获得检测的长度。因此,如果第n+1行的start
等于第n行的end
,则应聚合这些行。
下面是我的数据集的外观:
data = {
'filename': ['file1', 'file1', 'file1', 'file1', 'file1', 'file2', 'file2', 'file2', 'file2', 'file2'],
'start': [21, 24, 27, 44, 60, 34, 37, 55, 58, 120],
'end': [24, 27, 30, 47, 63, 37, 40, 58, 61, 123]}
df = pd.DataFrame(data)
以下是我希望得到的:
1条答案
按热度按时间r7s23pms1#
下面是一个实现您所要求的方法:
说明:
continuation
列中,用布尔值标记行,指示它们是否继续先前的声音检测keep
列中,将每个检测的最后一行(即,紧接在非连续行之前的每一行,以及 Dataframe 中的最后一行)标记为我们最终将保留的行start
值用来自相同声音检测的第一行的start
值更新;为此,请清空所有连续行中的start
值,然后使用ffill
向前填充这些空值keep
等于True的行,根据end
和start
计算duration
,并删除中间列continuation
和keep
输出:
注意:我添加了一个文件名为
file0
的初始行,其end
值与下一行(文件名为file1
)的start
值匹配,以证明不同文件之间没有聚合。替代代码:
说明:
continuation
和keep
列之后,使用cumsum
为新列groupnum
中的每一行分配声音检测索引groupby
按groupnum
对行进行分组concat
分别从每个组的第一行和最后一行获取start
和end
groupnum
索引不变,使用rename_axis
清空其名称,并计算新的duration
列。