Кажется, вы пытаетесь сделать label encoding
.
Я могу представить два варианта: pandas.factorize и sklearn.preprocessing.LabelEncoder .
Использование LabelEncoder
from sklearn.preprocessing import LabelEncoder
b = np.zeros_like(a, np.int)
for column in range(a.shape[1]):
b[:, column] = LabelEncoder().fit_transform(a[:, column])
Тогда b
будет:
array([[0, 0, 1],
[0, 1, 0],
[1, 2, 2]])
Если вы хотите иметь возможность вернуться к исходным значениям, вам необходимо сохранить кодировщики.Вы можете сделать это следующим образом:
from sklearn.preprocessing import LabelEncoder
encoders = {}
b = np.zeros_like(a, np.int)
for column in range(a.shape[1]):
encoders[column] = LabelEncoder()
b[:, column] = encoders[column].fit_transform(a[:, column])
Теперь encoders[0].classes_
будет иметь:
array(['A', 'D'], dtype='<U3')
Это означает, что «A» было сопоставлено с 0
, а «D» - 1
.
Наконец, если вы используете переопределение кодирования a
вместо использования новой матрицы c
, вы получите целые числа в виде строк ("1"
вместо 1
), вы можете решитьэто с astype(int
):
encoders = {}
for column in range(a.shape[1]):
encoders[column] = LabelEncoder()
a[:, column] = encoders[column].fit_transform(a[:, column])
# At this point, a will have strings instead of ints because a had type str
# array([['0', '0', '1'],
# ['0', '1', '0'],
# ['1', '2', '2']], dtype='<U3')
a = a.astype(int)
# Now `a` is of type int
# array([[0, 0, 1],
# [0, 1, 0],
# [1, 2, 2]])
Использование pd.factorize
factorize
возвращает закодированный столбец и отображение кодировки, поэтому, если вам это не важно, вы можете избежатьсохраняя его:
for column in range(a.shape[1]):
a[:, column], _ = pd.factorize(a[:, column]) # Drop mapping
a = a.astype(int) # same as above, it's of type str
# a is
# array([[0, 0, 1],
# [0, 1, 0],
# [1, 2, 2]])
Если вы хотите сохранить сопоставления кодировки:
mappings = []
for column in range(a.shape[1]):
a[:, column], mapping = pd.factorize(a[:, column])
mappings.append(mapping)
a = a.astype(int)
Теперь mappings[0]
будет иметь следующие данные:
array(['A', 'D'], dtype=object)
Какиеимеет ту же семантику, что и encoders[0].classes_
решения Sklearn LabelEncoder.