Удаление дубликатов на основе двух столбцов при удалении противоречивых данных

#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 — Какая-то проблема с решением?