#python #python-3.x #pandas
#python #python-3.x #pandas
Вопрос:
У меня есть фрейм данных 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 = neg, 1 = pos). Я знаю, как удалить дубликаты на основе значений первых 2 столбцов, однако в этом случае я также хотел бы избавиться от несогласованных данных, т.Е. дублированных данных, проверенных как как положительные, так и отрицательные. Так, например, первые 2 строки дублируются, но несовместимы, поэтому я должен удалить всю запись, в то время как последние 2 строки дублируются и согласованы, поэтому я бы сохранил одну из записей. Ожидаемый результат должен быть:
a b c
0 2 4 1
1 3 5 0
Реальный фрейм данных может содержать более двух дубликатов на группу, и
, как вы можете видеть, индекс также был изменен. Спасибо.
Ответ №1:
Сначала фильтруйте строки 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
Комментарии:
1. спасибо, израэль, ваш ответ почти идеален, он просто пропускает последнюю часть моего запроса об индексе, но это действительно очень простая вещь. Я только что добавил .reset_index(drop= True) в конце!!
2. @Simosini — Какая-то проблема с решением?