Эффективное объединение строк с близким набором значений в python pandas - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть python3 pandas Dataframe "df" (если это поможет, я могу избежать pandas для этого) с миллионами записей подключений к сайту, с параметрами: - id (строка ) - start_datetime (datetime (отметка времени в pandas)) - end_datetime (datetime (отметка времени в pandas))

Кадр данных, к сожалению, содержит то, что мы определили как дубликаты, где идентификатор соединения и start_datetime точно так же, и конец DateTime либо тот же, либо с разницей в 1-2 секунды. Мне нужно эффективно объединить эти записи в кадре данных. Пример:

В настоящее время содержит:

A) id: longidstring1, start_datetime '2020-04-01 10:00:00', end_datetime '2020-04- 01 13: 33: 37 '

B) id: longidstring1, start_datetime' 2020-04-01 10:00:00 ', end_datetime' 2020-04-01 13:33: 36 '

C) id: longidstring1, start_datetime' 2020-04-01 10:00:00 ', end_datetime' 2020-04-01 13: 33: 38 '

Мне нужно закончить только одной записью, равной C, так как она имеет наибольшую продолжительность между началом и концом. Кадр данных сортируется по идентификатору AS C, start_datetime AS C, но я также могу изменить это, если что-то еще имеет смысл.

Я пробовал следующие логи c, и это работает, но это медленно:

  1. Найдите уникальные идентификаторы в кадре данных для каждого уникального идентификатора
  2. Найдите все записи этого идентификатора в кадре данных.
  3. Затем включите эти записи в список, потому что у меня возникают проблемы с поиском примеров использования pandas для этого типа условного объединения.
  4. Выполните итерацию по каждой записи в списке, сравнивая start_datetime и end_datetime и отслеживая, какие записи необходимо объединить
  5. Наконец, верните новый список объединенных результатов и переходите к следующему уникальному идентификатору.

При наличии только около 8000 записей в кадре данных это занимает около 28 секунд, поэтому для 1 миллиона записей это может занять до часа. Буду признателен за любую помощь или идеи для ускорения этого. Если проще сделать MySQL, сделайте это немедленно, это тоже вариант. Текущий запрос:

SELECT start_datetime, end_datetime, combined_id 
FROM connection_table 
WHERE start_datetime BETWEEN %s AND %s AND end_datetime BETWEEN %s AND %s 
ORDER BY combined_id, start_datetime;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...