Как в dataframe удалить дубликаты строк кроме первого последнего?
В списке, в колонке, несколько фамилий, необходимо удалить все, кроме первой и последней строки каждой фамилии, если такие появляются. Параметр 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)
Ответы (1 шт):
Автор решения: Алексей Р
→ Ссылка
Группируем по фамилии, в каждой группе забираем первую и последнюю строки, из чего формируем результат
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 Петров Иван Выход