【发布时间】:2020-03-21 17:22:45
【问题描述】:
鉴于数据帧df 的分类值['A', 'B','C'] 的列letters,我想获得数据帧中的许多列,其中每一行只有一个与原始分类值对应的非零值。
例如来自数据框
letters
A
C
A
C
我想拥有:
A B C
1 0 0
0 0 1
1 0 0
0 0 1
现在在 pandas 中这很容易:
dummies = pd.get_dummies(df.letters)
res = pd.concat([df, dummies], axis=1)
df.drop('letters', axis=1, inplace=True)
在 scikit 中可以使用LabelBinarizer:
from sklearn.preprocessing import LabelBinarizer
cat_col = df["letters"]
encoder = LabelBinarizer()
col_1hot = encoder.fit_transform(cat_col)
col_1hot.toarray()
然而,这只是一个1-0 矩阵,我丢失了对原始分类值的引用。因此,我不能假设第一个 1-hot 列是 A,第二个是 B,依此类推。
那么如何在 SciKit learn 中执行 one-hot encoding 来获取数据帧呢?
编辑
@Joe Halliwell 建议做一些事情lb.inverse_transform(onehot) 所以在这个特定的情况下我做了
lb = preprocessing.LabelBinarizer()
onehot = lb.fit_transform(df)
res = pd.DataFrame(data=onehot, columns=lb.inverse_transform(onehot).reshape(-1,))
在这种情况下有效,因为行数等于类别。如果我有更多行,这将不再起作用
【问题讨论】:
标签: python python-3.x dataframe scikit-learn one-hot-encoding