Как двоично кодировать многозначную категориальную переменную из кадра данных Pandas?


9

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

    categories
0 - ["A", "B"]
1 - ["B", "C", "D"]
2 - ["B", "D"]

Как мы можем получить такой стол?

   "A"  "B"  "C"  "D"
0 - 1    1    0    0
1 - 0    1    1    1
2 - 0    1    0    1

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

Ответы:


7

Если [0, 1, 2]есть числовые метки и не является индексом, то pandas.DataFrame.pivot_tableработает:

В []:
data = pd.DataFrame.from_records (
    [[0, «A»], [0, «B»], [1, «B»], [1, «C»], [1, «D»], [2, «B»], [ 2, 'D']],
    columns = ['number_label', 'category'])
data.pivot_table (index = ['number_label'], столбцы = ['category'], aggfunc = [len], fill_value = 0)
Вне[]:
              Len
категория ABCD
number_label                       
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

Этот пост был полезен: http://pbpython.com/pandas-pivot-table-explained.html


Если [0, 1, 2]это индекс, то collections.Counterполезно:

В []:
data2 = pd.DataFrame.from_dict (
    {'Categories': {0: ['A', 'B'], 1: ['B', 'C', 'D'], 2: ['B', 'D']}})
data3 = data2 ['category']. apply (collection.Counter)
pd.DataFrame.from_records (данные3) .fillna (значение = 0)
Вне[]:
       ABCD
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

Спасибо, я проверю это. На самом деле, 0, 1 и 2 являются индексом. Кроме того, есть ли у вас какие-либо идеи о том, как эффективно обрабатывать разреженность, так как здесь много нулей?
Денис Л

И панды, и scipy имеют разреженные структуры данных ( pandas sparse , scipy sparse ) для сохранения памяти, но они могут не поддерживаться используемой библиотекой машинного обучения. Если размерность вашей задачи (количество столбцов) настолько велика, что требуется разреженное представление, вы можете рассмотреть также использование методов уменьшения размерности .
Сэмюэль Харролд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.