我有一个包含许多列的数据框。其中一些是字符串,另一些是整数。 我使用此代码对我的数据框进行编码:
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')
最佳答案
列与列之间的数据类型不同,因此将 apply
与 fit_transform
一起使用在这里不起作用。它似乎可以正常工作,但 LabelEncoder
将在操作结束时适合最右边的列,因此当您尝试应用 inverse_transform
时,LabelEncoder会将其他列中的所有元素替换为它在最右边列中看到的元素。例如:
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
关于python - 用 sklearn 解码 pandas 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55056786/