У меня есть фрейм данных pandas, подобный этому:
a b c
0 1 1 1
1 1 1 0
2 2 4 1
3 3 5 0
4 3 5 0
где первые 2 столбца («a» и «b») — это идентификаторы, а последний («c») — проверка (0 = отрицательный, 1 = положительный). Я знаю, как удалить дубликаты на основе значений первых двух столбцов, однако в этом случае я также хотел бы избавиться от противоречивых данных, т.е. дублированных данных, проверенных как положительно, так и отрицательно. Так, например, первые 2 строки дублируются, но несовместимы, поэтому я должен удалить всю запись, а последние 2 строки дублируются и согласуются, поэтому я бы сохранил одну из записей. Ожидаемый результат должен быть:
a b c
0 2 4 1
1 3 5 0
Реальный фрейм данных может иметь более двух дубликатов на группу и как вы можете видеть, также был изменен индекс. Спасибо.
Сначала отфильтруйте строки по GroupBy.transform
с SeriesGroupBy.nunique
, чтобы получить только уникальные группы значений с boolean indexing
, а затем DataFrame.drop_duplicates
:
df = (df[df.groupby(['a','b'])['c'].transform('nunique').eq(1)]
.drop_duplicates(['a','b'])
.reset_index(drop=True))
print (df)
a b c
0 2 4 1
1 3 5 0
Деталь:
print (df.groupby(['a','b'])['c'].transform('nunique'))
0 2
1 2
2 1
3 1
4 1
Name: c, dtype: int64
@Simosini - Какая-то проблема с решением?
спасибо jezrael, ваш ответ почти идеален, он просто пропускает последнюю часть моего запроса об индексе, но это действительно очень просто. Я только что добавил .reset_index(drop=True) в конце!!