Як двійковою кодувати багатозначну категоричну змінну з фрейму даних 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

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

Відповіді:


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"]],
    столбцы = ['номер_марки', 'категорія'])
data.pivot_table (index = ['number_label'], столбцы = ['категорія'], aggfunc = [len], fill_value = 0)
Вийшов []:
              лін
категорія 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 (
    {'категорії': {0: ['A', 'B'], 1: ['B', 'C', 'D'], 2: ['B', 'D']}})
data3 = data2 ['категорії']. застосовувати (collection.Counter)
pd.DataFrame.from_records (data3) .fillna (значення = 0)
Вийшов []:
       А Б В Г
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.