我需要在包含多个实时信号和一个时间戳列的数据帧中找到某些触发器之间的数据。这些触发器保存在单独的数据框中。我有一个带有for循环的工作解决方案,它在我使用的相对较大的数据集上花费时间。我试图通过列表理解来加快速度,但我找不到有效的解决方案。有人知道如何更快地做到这一点吗
for循环解决方案:
这是触发器数据帧的外观:
timestamp_x start_trig id timestamp_y end_trig
0 1592724037612 1.0 12 1592724068408 -1.0
1 1592724459283 1.0 23 1592724490290 -1.0
2 1592724514246 1.0 17 1592724545450 -1.0
这是将旧数据框中名为“data”的行附加到名为new_df的新数据框中的代码
for i in range(len(df_trig)):
mask = data[(data['timestamp'] > df_trig.iloc[i].timestamp_x) & (data['timestamp'] < df_trig.iloc[i].timestamp_y)]
new_df = new_df.append(mask)
这就是我试图用一台发电机解决的问题,它对我不起作用:
new_df = pd.DataFrame(data[(data['timestamp'] > low_lim) & (data['timestamp'] < upp_lim)] for low_lim,upp_lim in zip(df_trig['timestamp_x'], df_trig['timestamp_y']))
感谢您提前给出的答案
编辑:
原始数据框包含以下内容:
timestamp id param1
0 1592724037612 23 56.1
1 1592724037712 23 56.1
2 1592724037812 23 56.0
...
100 1592724047612 17 54.7
目标是从另一个数据帧移动任何触发器对之间的所有行。因此,新数据框看起来几乎相同,只是缺少了超出触发器数据框中定义范围的行
我做了一些没有for循环的代码。据我所知,使用pandas库的内置函数比使用for循环更快。但是,我不确定这对你来说是否足够快
数据帧触发器
数据帧数据
对数据进行合并触发,如笛卡尔积样式。这就是行的所有情况。 我在堆栈溢出中发现了实现这一点的技巧,它使用临时密钥
data.assign(key=1).merge(trig.assign(key=1)).drop(columns='key')
它产生了
符合触发器的屏幕行
data.assign(key=1).merge(trig.assign(key=1)).drop(columns='key').query('timestamp_x<;timestamp<;timestamp_y'))
它产生了
我找到了一个基于列表理解的解决方案,加快了处理时间:
相关问题 更多 >
编程相关推荐