Python-scikit-learn中跨多列的标签编码
我正在尝试使用scikit-learn LabelEncoder
来编码一大串DataFrame
字符串标签。由于数据框有许多(50+)列,因此我想避免LabelEncoder
为每一列创建一个对象。我宁愿只有一个LabelEncoder
可以在我所有数据列中使用的大对象。
将整个数据DataFrame
投入LabelEncoder
会产生以下错误。请记住,我在这里使用伪数据。实际上,我正在处理大约50列的字符串标记数据,因此需要一种不按名称引用任何列的解决方案。
import pandasfrom sklearn import preprocessing
df = pandas.DataFrame({
'pets': ['cat', 'dog', 'cat', 'monkey', 'dog', 'dog'],
'owner': ['Champ', 'Ron', 'Brick', 'Champ', 'Veronica', 'Ron'],
'location': ['San_Diego', 'New_York', 'New_York', 'San_Diego', 'San_Diego',
'New_York']
})
le = preprocessing.LabelEncoder()
le.fit(df)
追溯(最近一次通话最近):文件“ /Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/label.py”
中的行1,在第y行中= column_or_1d
中的第306行“ column_or_1d(y,warn = True)
文件“ /Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py”
引发ValueError
(“错误的输入形状{ 0}“。format(shape))ValueError:
输入形状错误(6,3)
关于如何解决这个问题有什么想法吗?
回答:
你可以轻松地做到这一点,
df.apply(LabelEncoder().fit_transform)
编辑2:
在scikit-learn 0.20中,推荐的方法是
OneHotEncoder().fit_transform(df)
因为OneHotEncoder现在支持字符串输入。使用ColumnTransformer可以仅将OneHotEncoder应用于某些列。
编辑:
由于这个答案是一年多以前的,并且产生了很多赞誉(包括赏金),所以我可能应该进一步扩大。
对于inverse_transform和transform,你必须做一点改动。
from collections import defaultdictd = defaultdict(LabelEncoder)
这样,你现在将所有列保留LabelEncoder为字典。
# Encoding the variablefit = df.apply(lambda x: d[x.name].fit_transform(x))
# Inverse the encoded
fit.apply(lambda x: d[x.name].inverse_transform(x))
# Using the dictionary to label future data
df.apply(lambda x: d[x.name].transform(x))
以上是 Python-scikit-learn中跨多列的标签编码 的全部内容, 来源链接: utcz.com/qa/431054.html