Есть ли способ удалить повторяющиеся строки с заданным условием c в пределах Pandas? - PullRequest
2 голосов
/ 21 января 2020

У меня есть датафрейм (df), который содержит несколько перекрывающихся строк времени. Я хотел бы удалить строку с большей продолжительностью, сохранив строку с меньшей продолжительностью из того же идентификатора. (для уменьшения перекрытия)

    starttime                  endtime                      ID      Diff

    1/7/2020 2:32:15 PM        1/7/2020 2:32:16 PM          A       1 sec
    1/8/2020 2:33:20 PM        1/8/2020 2:33:22 PM          B       2 sec
    1/9/2020 5:35:00 AM        1/9/2020 5:35:25 AM          C       25 sec
    1/9/2020 5:35:05 AM        1/9/2020 5:35:25 AM          C       20 sec

Я хотел бы получить следующий результат:

    starttime                  endtime                      ID      Diff

    1/7/2020 2:32:15 PM        1/7/2020 2:32:16 PM          A       1 sec
    1/8/2020 2:33:20 PM        1/8/2020 2:33:22 PM          B       2 sec
    1/9/2020 5:35:05 AM        1/9/2020 5:35:25 AM          C       20 sec

Обратите внимание, что первая строка из группы C удалена, поскольку длительность времени была больше, чем Первая строка из группы C.

Это мой код:

        import numpy as np
        import pandas as pd

        subset = df[df['diff'] >=  )
        df.drop(subset, inplace = True)

Моя дилемма в том, что я не знаю, как правильно написать правильный код для удаления строки с большей продолжительностью. (сохраняя строку с более короткой продолжительностью) Я исследовал это и придумал приведенный выше код. Любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 21 января 2020

Используйте sort_values, затем drop_duplicates:

df.sort_values(['ID', 'Diff']).drop_duplicates(subset=['ID'])

Выход:

             starttime              endtime ID  Diff
0  1/7/2020 2:32:15 PM  1/7/2020 2:32:16 PM  A     1
1  1/8/2020 2:33:20 PM  1/8/2020 2:33:22 PM  B     2
3  1/9/2020 5:35:05 AM  1/9/2020 5:35:25 AM  C    20
1 голос
/ 21 января 2020

Просто используйте groupby:

df['Diff'] = df['Diff'].str.extract('(\d+)').astype(float)
print(df.loc[df.groupby('ID')['Diff'].idxmin()])

Сначала я извлекаю только числовые значения c из каждой строки в столбце Diff, затем преобразую его в float, затем группирую по столбцу ID и получим индекс с минимальным значением каждой группы, затем я использую loc для извлечения этих индексов.

1 голос
/ 21 января 2020

Предполагая, что длительность все в sec, вы можете:

Извлечь длительность как целое число и отсортировать ее:

df['duration'] = df['Diff'].str.extract('(\d+)').astype(float)
df = df.sort_values('duration')

Затем удалить дубликаты

df = df.drop_duplicates(subset=['starttime','endtime','ID'], keep='first')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...