Многостолбцовое кодирование этикетки: отображение печати - PullRequest
0 голосов
/ 25 июня 2018

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

import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame([['A','B','C','D','E','F','G','I','K','H'],
                   ['A','E','H','F','G','I','K','','',''],
                   ['A','C','I','F','H','G','','','','']], 
                  columns=['A1', 'A2', 'A3','A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10'])

pd.DataFrame(columns=df.columns, data=LabelEncoder().fit_transform(df.values.flatten()).reshape(df.shape))

    A1  A2  A3  A4  A5  A6  A7  A8  A9  A10
0   1   2   3   4   5   6   7   9   10  8
1   1   5   8   6   7   9   10  0   0   0
2   1   3   9   6   8   7   0   0   0   0

Вопрос:

Как запросить сопоставления (похоже, они отсортированыпо алфавиту)?

Т.е. список вроде:

A: 1
B: 2
C: 3
...
I: 9
K: 10

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Я думаю, что есть transform в LabelEncoder

le=LabelEncoder()
le.fit(df.values.flatten())
dict(zip(df.values.flatten(),le.transform(df.values.flatten()) ))
Out[137]: 
{'': 0,
 'A': 1,
 'B': 2,
 'C': 3,
 'D': 4,
 'E': 5,
 'F': 6,
 'G': 7,
 'H': 8,
 'I': 9,
 'K': 10}
0 голосов
/ 25 июня 2018

да, возможно, если вы определите LabelEncoder отдельно и запросите его атрибут classes_ позже.

le = LabelEncoder()
data = le.fit_transform(df.values.flatten())

dict(zip(le.classes_[1:], np.arange(1, len(le.classes_))))
{'A': 1,
 'B': 2,
 'C': 3,
 'D': 4,
 'E': 5,
 'F': 6,
 'G': 7,
 'H': 8,
 'I': 9,
 'K': 10}

classes_ хранит список классов в порядке их кодирования.

le.classes_
array(['', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K'], dtype=object)

Таким образом, можно смело предположить, что первый элемент закодирован как 1 и т. Д.

Для обратного кодирования используйте le.inverse_transform.

...