декодировать фреймы данных панд с помощью sklearn - PullRequest
2 голосов
/ 08 марта 2019

У меня есть фрейм данных со многими столбцами. некоторые из них строковые, а некоторые целые. Я использовал этот код для кодирования моего фрейма данных:

le = LabelEncoder()
for col in df.columns:
    df_encoded[col] = df.apply(le.fit_transform)

это сработало! но когда я хочу расшифровать его с помощью этого кода:

for col in df.columns:
    df_decoded[col] = df_encoded.apply(le.inverse_transform)

Я получаю эту ошибку:

ValueError: ('The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()', 'occurred at index MYCOLUMNNAME')

1 Ответ

1 голос
/ 08 марта 2019

Тип данных отличается от столбца к столбцу, поэтому использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...