给列letters
加上数据帧['A', 'B','C']
的分类值df
,我想在数据帧中获得许多列,其中每一行只有一个非零值,对应于原始分类值。
例如来自数据框
letters
A
C
A
C
我想要拥有:
A B C
1 0 0
0 0 1
1 0 0
0 0 1
现在在熊猫中这很容易:
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中执行一键编码学习获取数据帧?
编辑
@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,))
在这种情况下有效,因为行数等于类别。如果我有更多的行,这将不再起作用
答案 0 :(得分:2)
您不能使用SciKit Learn获取DataFrame。不过,您可以在适合的inverse_transform
上调用LabelBinarizer
方法来检索标签,例如
import pandas as pd
from sklearn import preprocessing
df = pd.DataFrame({"foo": ["A", "C", "B", "A"]})
lb = preprocessing.LabelBinarizer()
onehot = lb.fit_transform(df)
print(lb.inverse_transform(onehot))
因此,为了检索一次性编码矩阵中各列的标签,您可以通过逆变换来运行单位矩阵:
print(lb.inverse_transform(np.identity(onehot.shape[1]))