Есть ли быстрый способ избежать циклов for для создания нового фрейма данных на основе данных из другого фрейма данных? - PullRequest
0 голосов
/ 07 августа 2020

Мне нужно найти данные между определенными триггерами в кадре данных, который содержит несколько сигналов реального времени и один столбец с меткой времени. Эти триггеры сохраняются в отдельном фрейме данных. У меня есть рабочее решение с for-l oop, которое требует времени на относительно большой набор данных, который я использую. Я пытаюсь ускорить работу с помощью списков, но не могу найти рабочего решения. Есть ли у кого-нибудь идеи, как это сделать быстрее?

Решения for-l oop:

Так выглядит фрейм данных триггера:

      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

И это код для добавления строк в старом фрейме данных с именем «данные» в новый фрейм данных с именем 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']))

Заранее спасибо за ответы!

РЕДАКТИРОВАТЬ:

Исходные данные frame содержит выглядит следующим образом:

        timestamp          id        param1
0   1592724037612          23          56.1
1   1592724037712          23          56.1
2   1592724037812          23          56.0
...
100 1592724047612          17          54.7

Цель состоит в том, чтобы переместить все строки, которые находятся между любой из пар триггеров из другого кадра данных. Поэтому новый фрейм данных выглядит почти идентично, за исключением того, что отсутствуют строки, выходящие за пределы диапазонов, определенных в фрейме данных триггера.

Ответы [ 2 ]

1 голос
/ 08 августа 2020

Я нашел решение, основанное на понимании списка, которое ускорило время обработки:

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)
0 голосов
/ 07 августа 2020

Я сделал код без l oop. Насколько я знаю, быстрее использовать встроенную функцию библиотеки pandas, чем использовать для l oop. Но я не уверен, что это достаточно быстро в вашем случае.

  1. Настроить

триггер фрейма данных

dataframe trig

dataframe data

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

    , и это дает

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...