通过比较时间和持续时间来合并数据框 pandas 中的行
Posted
技术标签:
【中文标题】通过比较时间和持续时间来合并数据框 pandas 中的行【英文标题】:Merging rows in a dataframe pandas by comparing time and duration 【发布时间】:2020-04-12 09:09:41 【问题描述】:在同一数据框中合并行(数百万条记录)的最有效方法是什么?
输入/输出列 [id, startTime(secs), duration(secs)]
对于给定的 id,如果 startTime + duration 等于下一行的 startTime(对于相同的 id),则输出数据帧应包含 id 和最小 startTime 行以及所有持续时间的总和。
注意:即使 startTime + duration 之和相差 1 秒,也不应合并到现有行,而应显示为单独的行。
Input DataFrame
id startTime(secs) duration(secs)
1 65760 60
1 65820 780
1 66600 1740
1 68340 60
1 68401 120
1 68521 60
1 69000 120
2 67899 60
3 56000 780
3 56780 60
Output DataFrame
id startTime(secs) duration(secs)
1 65760 2640
1 68401 180
1 69000 120
2 67899 60
3 56000 840
在上面的例子中,对于前四行,
row1 -> id =1, startTime + duration = 65760 + 60 = 65820 ==> row2 (startTime), 因此 row1 的 startTime 为 65760,duration 为 840 (60 + 780)。
相对于 row3 的新 row1,row1 startTime 65760 + 860(新计算的持续时间)= 66600 ==> row3 的 startTime。现在 row1 将变为 1, 65760, 2580 [id, startTime(secs), duration(secs)]。
再次,关于 row4 的新 row1,row1 startTime 65760 + 2580(新计算的持续时间)= 68340 == row4 的 startTime。现在 row1 将变为 1, 65760, 2640 [id, startTime(secs), duration(secs)]。
现在,关于第 5 行的新第 1 行,第 1 行开始时间 65760 + 2640(新计算的持续时间)= 68400 != 第 5 行的开始时间。第 1 行将是 1、65760、2640 [id, startTime(secs), duration(secs)],第 5 行将被视为单独的行。
【问题讨论】:
单行是否可能重叠到下一行? IE。 65760 在您的第一行中持续时间为 80 秒?只是逻辑复杂了一点 没有。它不会。对于 id,每一行 startTime + duration 将等于或大于下一行。此外,startTime 是按 id 排序的。 【参考方案1】:如果您可以保证重叠只发生在边缘,您可以检查id
是否相同,并且停止与下一行的开始是否相同,以创建分组变量。
df['stop'] = df['startTime(secs)'] + df['duration(secs)']
s = (df.id.ne(df.id.shift()) | df['stop'].shift().ne(df['startTime(secs)'])).cumsum()
df.groupby(s).agg('id': 'first', 'startTime(secs)': 'min', 'duration(secs)': 'sum')
# id startTime(secs) duration(secs)
#1 1 65760 2640
#2 1 68401 180
#3 1 69000 120
#4 2 67899 60
#5 3 56000 840
【讨论】:
以上是关于通过比较时间和持续时间来合并数据框 pandas 中的行的主要内容,如果未能解决你的问题,请参考以下文章