Горячее кодирование нескольких столбцов в столбцах sklearn и именования - PullRequest
2 голосов
/ 18 марта 2019

У меня есть следующий код для быстрого кодирования 2 столбцов, которые у меня есть.

# encode city labels using one-hot encoding scheme
city_ohe = OneHotEncoder(categories='auto')
city_feature_arr = city_ohe.fit_transform(df[['city']]).toarray()
city_feature_labels = city_ohe.categories_
city_features = pd.DataFrame(city_feature_arr, columns=city_feature_labels)

phone_ohe = OneHotEncoder(categories='auto')
phone_feature_arr = phone_ohe.fit_transform(df[['phone']]).toarray()
phone_feature_labels = phone_ohe.categories_
phone_features = pd.DataFrame(phone_feature_arr, columns=phone_feature_labels)

Что мне интересно, так это то, как я делаю это в 4 строки, получая при этом правильные имена столбцов в выходных данных. То есть я могу создать должным образом горячий кодированный массив, включив имена обоих столбцов в fit_transform, но когда я пытаюсь назвать столбцы результирующего информационного кадра, он говорит мне, что существует несоответствие между формой индексов:

ValueError: Shape of passed values is (6, 50000), indices imply (3, 50000)

Для фона у телефона и города есть 3 значения.

    city    phone
0   CityA   iPhone
1   CityB Android
2   CityB iPhone
3   CityA   iPhone
4   CityC   Android

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Вы почти у цели ... Как вы сказали, вы можете добавить все столбцы, которые хотите закодировать, непосредственно в fit_transform.

ohe = OneHotEncoder(categories='auto')
feature_arr = ohe.fit_transform(df[['phone','city']]).toarray()
feature_labels = ohe.categories_

И тогда вам просто нужно сделать следующее:

feature_labels = np.array(feature_labels).ravel()

Что позволяет вам назвать ваши столбцы так, как вы хотели:

features = pd.DataFrame(feature_arr, columns=feature_labels)
1 голос
/ 19 марта 2019

Почему бы вам не взглянуть на pd.get_dummies ? Вот как вы можете кодировать:

df['city'] = df['city'].astype('category')
df['phone'] = df['phone'].astype('category')
df = pd.get_dummies(df)
...