Тип данных отличается от столбца к столбцу, поэтому использование apply
с fit_transform
здесь не сработает. Кажется, он будет работать правильно, но LabelEncoder
будет установлен в крайнем правом столбце в конце операции, поэтому, когда вы попытаетесь применить inverse_transform
, LabelEncoder заменит все элементы в других столбцах на те, которые он видел в самой правой колонке. E.g.:
df = pd.DataFrame([{'A': 1, 'B': 'p'}, {'A': 1, 'B': 'q'}, {'A': 2, 'B': 'o'}, {'A': 3, 'B': 'p'}])
df
A B
0 1 p
1 1 q
2 2 o
3 3 p
df = df.apply(le.fit_transform)
df
A B
0 0 1
1 0 2
2 1 0
3 2 1 # Looks fine
df.apply(le.inverse_transform)
A B
0 o p
1 o q
2 p o
3 q p # Whoops
Вы увидите тот же результат, даже если вы будете перебирать столбцы один за другим и выполнять fit_transform
и inverse_transform
.
Перед инвертированием необходимо установить кодировщик в правильный столбец:
le = LabelEncoder()
df_encoded = pd.DataFrame(columns=df.columns)
df_decoded = pd.DataFrame(columns=df.columns)
for col in df.columns:
df_encoded[col] = le.fit_transform(df[col])
df_encoded
A B
0 0 1
1 0 2
2 1 0
3 2 1
for col in df.columns:
le = le.fit(df[col])
df_decoded[col] = le.inverse_transform(df_encoded[col])
df_decoded
A B
0 1 p
1 1 q
2 2 o
3 3 p # Yeay