Как создать матрицу сравнения по элементам в pandas?

#python #pandas

#python #pandas

Вопрос:

Предположим, что существует серия pandas (например, следующая)

 1 A
2 C
3 A
4 B
5 C
  

Существует также список элементов, например [A, B, C, D]. Цель состоит в том, чтобы получить фрейм данных со столбцами этого списка и теми же строками, что и в серии, и каждая ячейка представляет собой логическое значение, которое указывает, равно ли значение в серии значению столбца. В моем примере это было бы следующим:

     A     B     C     D
1 True  False False False
2 False False True  False
3 True  False False False
4 False True  False False
5 False False True  False
  

Конечно, этого можно достичь с помощью простого цикла for (что-то вроде этого:)

 for i in the_list:
   df[i] = the_series == i
  

Но это мучительно медленно, особенно когда список большой. Итак, я спрашиваю, есть ли более быстрый способ достижения этого в стиле pandas?

Ответ №1:

Давайте попробуем get_dummies

 s = s.str.get_dummies().astype(bool)
  

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

1. или pd.get_dummies(s,dtype=bool) напрямую 🙂

2. Спасибо за ваш ответ. К сожалению, хотя это работает для приведенного примера, это не полностью решает мою проблему, потому что мне нужно поддерживать определенный порядок, а также включать значения в столбцы, которые не отображаются последовательно

3. @kandi s = s.str.get_dummies().astype(bool). переиндексировать (столбцы =ваш порядок)

4. проверьте мой ответ, который поддерживает порядок. вы также можете использовать .reindex

Ответ №2:

Попробуйте этот метод —

pd.get_dummies получает вам одну горячую кодированную версию серии и по мере изменения типа 1 на True и 0 на False .

 s = pd.Series(['A','B','C','B','D','A','C'])
cols = ['A','B','C','D'] #put the order of your columns here

pd.get_dummies(s).astype(bool)[cols]

  
        A      B      C      D
0   True  False  False  False
1  False   True  False  False
2  False  False   True  False
3  False   True  False  False
4  False  False  False   True
5   True  False  False  False
6  False  False   True  False