Как в dataframe удалить дубликаты строк кроме первого последнего?

Рейтинг: 1Ответов: 1Опубликовано: 07.05.2023

В списке, в колонке, несколько фамилий, необходимо удалить все, кроме первой и последней строки каждой фамилии, если такие появляются. Параметр keep не подходит, т.к. удаляет (точнее должен удалять) или все дубликаты или только какой-то (первый или последний). Не могу понять как провернуть такое. Спасибо.

Пример:

время    ФИО      событие
03:12  Иванов Пётр  Вход
05:14  Иванов Пётр  Выход
09:18  Иванов Пётр  Вход
09:25  Иванов Пётр  Выход
03:10  Петров Иван  Вход
06:10  Петров Иван  Выход
08:10  Петров Иван  Выход
13:10  Петров Иван  Вход
13:15  Петров Иван  Выход

Нужно получить:

время    ФИО      событие
03:12  Иванов Пётр  Вход
09:25  Иванов Пётр  Выход
03:10  Петров Иван  Вход
13:15  Петров Иван  Выход

Строка типа этой не помогает, даже просто дубликаты не удаляются

df.drop_duplicates (subset=['ФИО', 'Событие'], keep=False)

Ответы

▲ 2Принят

Группируем по фамилии, в каждой группе забираем первую и последнюю строки, из чего формируем результат

df = pd.DataFrame({'время': ['03:12', '05:14', '09:18', '09:25', '03:10', '06:10', '08:10', '13:10', '13:15'],
                   'ФИО': ['Иванов Пётр', 'Иванов Пётр', 'Иванов Пётр', 'Иванов Пётр', 'Петров Иван', 'Петров Иван',
                           'Петров Иван', 'Петров Иван', 'Петров Иван'],
                   'событие': ['Вход', 'Выход', 'Вход', 'Выход', 'Вход', 'Выход', 'Выход', 'Вход', 'Выход']})
df = df.groupby('ФИО',sort=False,as_index=False).apply(lambda x: pd.concat([x.head(1),x.tail(1)])).reset_index(drop=True)
print(df)
   время          ФИО событие
0  03:12  Иванов Пётр    Вход
1  09:25  Иванов Пётр   Выход
2  03:10  Петров Иван    Вход
3  13:15  Петров Иван   Выход