通过比较时间和持续时间来合并数据框 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 中的行的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 通过取列之间的平均值来合并两个数据框

在 pandas/python 的同一数据框中将两列合并为一列

熊猫数据框合并选择列

可以使用比较来合并两个熊猫数据框吗?

加入/合并两个 Pandas 数据框并将列用作多索引

Pandas:合并数据框并将多个连接值合并到一个数组中