Как я могу использовать кодировщик меток sklearn и напрямую обращаться к моему кадру данных

У меня есть кадр данных, и я хочу использовать LabelEncoder непосредственно на нем.

Датафрейм:

df.select_dtypes('object').iloc[:,1:]

  Gender  Married x_y   x_z 
0   Male    No     0     No       
1   Male    Yes    1     No         
2   Male    Yes    2     Yes        
3   Male    Yes    3+    No   
4   Male    No     1     No     

Я пробовал это:

le = LabelEncoder()
df.select_dtypes('object').iloc[:,1:].apply(le.fit_transform, axis=1)

TypeError: ("'‹' не поддерживается между экземплярами 'float' и 'str'", 'произошло по индексу 11')

df.select_dtypes('object').iloc[:,1:].apply(LabelEncoder.fit_transform)

TypeError: ("fit_transform() отсутствует 1 обязательный позиционный аргумент: 'y'", 'произошло по индексу Gender')

Любая помощь о том, как его использовать.


person user_6396    schedule 03.10.2018    source источник
comment
Во-первых, LabelEncoder() предназначен для одного столбца, ваших целей или ярлыков категорий. Вы ищете OneHotEncoder()?   -  person G. Anderson    schedule 04.10.2018
comment
@ G.Anderson Я видел несколько сообщений о том, что вы можете использовать его через функцию apply.   -  person user_6396    schedule 04.10.2018
comment
Я хочу преобразовать метки категорий в o или 1 напрямую в зависимости от категории.   -  person user_6396    schedule 04.10.2018
comment
df.apply(LabelEncoder().fit_transform), где df — это кадр данных со всеми столбцами, которые вы хотите преобразовать.   -  person Alexander    schedule 04.10.2018


Ответы (2)


Предполагая, что df - это ваш отфильтрованный кадр данных, который вы хотите преобразовать (например, в соответствии с вашим примером в вопросе):

>>> df.apply(LabelEncoder().fit_transform)
   Gender  Married  x_y  x_z
0       0        0    0    0
1       0        1    1    0
2       0        1    2    1
3       0        1    3    0
4       0        0    1    0

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

encoders = {col: LabelEncoder().fit(df[col]) for col in df}

encoded_df = pd.DataFrame(
    {col: encoders[col].transform(df[col]) for col in df},
    index=df.index)
>>>encoded_df
   Gender  Married  x_y  x_z
0       0        0    0    0
1       0        1    1    0
2       0        1    2    1
3       0        1    3    0
4       0        0    1    0

decoded_df = pd.DataFrame(
    {col: encoders[col].inverse_transform(encoded_df[col]) for col in encoded_df},
    index=encoded_df.index)
  Gender Married x_y  x_z
0   Male      No   0   No
1   Male     Yes   1   No
2   Male     Yes   2  Yes
3   Male     Yes  3+   No
4   Male      No   1   No
person Alexander    schedule 03.10.2018
comment
Спасибо, это, кажется, помогает. Можно ли конвертировать их обратно? - person user_6396; 04.10.2018

Самый простой способ, который я могу придумать, - это выбрать столбцы объекта, затем прокрутить их и fit_transform() с помощью LabelEncoder.

for col in df.select_dtypes(object).columns:
    df[col]=LabelEncoder().fit_transform(df[col])
person G. Anderson    schedule 03.10.2018
comment
Можно ли добиться этого с помощью функции apply? - person user_6396; 04.10.2018