我正在尝试使用scikit-learn LabelEncoder来编码一大串DataFrame字符串标签。由于数据框有许多(50+)列,因此我想避免LabelEncoder为每一列创建一个对象。我宁愿只有一个LabelEncoder可以在我所有数据列中使用的大对象。
scikit-learn LabelEncoder
DataFrame
LabelEncoder
将整个数据DataFrame投入LabelEncoder会产生以下错误。请记住,我在这里使用伪数据。实际上,我正在处理大约50列的字符串标记数据,因此需要一种不按名称引用任何列的解决方案。
import pandas from 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)
“ /Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/label.py”
column_or_1d
“ column_or_1d(y,warn = True)
“ /Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py”
ValueError
{ 0}“。format(shape))ValueError:
关于如何解决这个问题有什么想法吗?
你可以轻松地做到这一点,
df.apply(LabelEncoder().fit_transform)
编辑2:
在scikit-learn 0.20中,推荐的方法是
OneHotEncoder().fit_transform(df)
因为OneHotEncoder现在支持字符串输入。使用ColumnTransformer可以仅将OneHotEncoder应用于某些列。
编辑:
由于这个答案是一年多以前的,并且产生了很多赞誉(包括赏金),所以我可能应该进一步扩大。
对于inverse_transform和transform,你必须做一点改动。
from collections import defaultdict d = defaultdict(LabelEncoder)
这样,你现在将所有列保留LabelEncoder为字典。
# Encoding the variable fit = 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))