有没有一种快速的方法可以避免基于另一个数据帧的数据生成新数据帧的for循环?

2024-05-06 11:46:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在包含多个实时信号和一个时间戳列的数据帧中找到某些触发器之间的数据。这些触发器保存在单独的数据框中。我有一个带有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

目标是从另一个数据帧移动任何触发器对之间的所有行。因此,新数据框看起来几乎相同,只是缺少了超出触发器数据框中定义范围的行


Tags: 数据iniddfnewfordata时间
2条回答

我做了一些没有for循环的代码。据我所知,使用pandas库的内置函数比使用for循环更快。但是,我不确定这对你来说是否足够快

  1. 设立

数据帧触发器

dataframe trig

数据帧数据

dataframe data

  1. 对数据进行合并触发,如笛卡尔积样式。这就是行的所有情况。 我在堆栈溢出中发现了实现这一点的技巧,它使用临时密钥

    data.assign(key=1).merge(trig.assign(key=1)).drop(columns='key')

    它产生了

enter image description here

  1. 符合触发器的屏幕行

    data.assign(key=1).merge(trig.assign(key=1)).drop(columns='key').query('timestamp_x<;timestamp<;timestamp_y'))

    它产生了

enter image description here

我找到了一个基于列表理解的解决方案,加快了处理时间:

list_cycles = [data[(data['timestamp'] > low_lim) & (data['timestamp'] < upp_lim)] for low_lim,upp_lim in zip(df_trig['timestamp_x'], df_trig['timestamp_y'])]
new_df = pd.concat(list_cycles,ignore_index = True)

相关问题 更多 >