Как удалить повторяющиеся записи в строке столбца у панд?

#python #pandas

Вопрос:

У меня есть этот фрейм данных введите описание изображения здесь

Я хочу удалить повторяющиеся записи в строке столбца и вернуть только уникальные значения. Я пытался set(df['unit]) , но это совсем не помогло. Я хочу иметь только (New Ward, Adult Ward)/(Pediatric Ward) , например. Не могли бы вы сообщить мне, как исправить эту ошибку?

Комментарии:

1. Ваши записи выглядят как списки, поэтому вы должны получить доступ к каждому из этих списков, чтобы преобразовать их в наборы, чтобы получить уникальные записи.

2. Вы можете использовать метод pandas drop_duplicates ().

Ответ №1:

Похоже, ваши ячейки содержат строки, разделенные запятыми. В этом случае вы можете

  • разделите записи на ',s*' (запятая плюс необязательный пробел),
  • преобразуйте их в наборы,
  • и соедините их строками, разделенными запятыми:
 df['unit'] = df.unit.str.split(',s*').apply(set).str.join(', ')
 

Однако у такого способа кодирования значений есть и недостатки. (Например, 'Adult Ward, New WARD' и 'New WARD, Adult Ward' было бы двумя различными значениями, когда на самом деле они идентичны). Рассмотрите возможность обработки каждой палаты как отдельной колонки, например,

 for w in ['Pediatric Ward', 'New Ward', 'Adult Ward']:
    df[w] = df.unit.str.contains(w, case=False)
 

в результате для каждой палаты будут созданы отдельные столбцы, с которыми будет намного проще работать в дальнейшем, например, получать комбинации палат:

                    unit  Pediatric Ward  New Ward  Adult Ward
0        Pediatric Ward            True     False       False
1  Adult Ward, New WARD           False      True        True
2              New WARD           False      True       False
3        Pediatric Ward            True     False       False
4  Adult Ward, New WARD           False      True        True
 

Комментарии:

1. Блестяще! Спасибо, @fsimonjetz! Что касается "WARD" проблемы, я справляюсь с ней, добавляя шаг очистки. df['unit']=df['unit'].replace({"WARD", "Ward"}, regex=True)