我试图使用scikit learn的LabelEncoder对字符串标签的数据帧进行编码。由于dataframe有许多(50+)列,我希望避免为每个列创建LabelEncoder对象;我宁愿只使用一个大的LabelEncoder对象来跨所有的数据列工作
将整个DataFrame放入LabelEncoder会产生以下错误。请记住,我在这里使用的是虚拟数据;实际上,我正在处理大约50列的字符串标记数据,因此需要一个不按名称引用任何列的解决方案
导入熊猫
从sk学习导入预处理
df=1.DataFrame({
“宠物”:[“猫”、“狗”、“猫”、“猴”、“狗”、“狗”],
‘所有者’:[‘冠军’、‘罗恩’、‘布里克’、‘冠军’、‘维罗妮卡’、‘罗恩’],
‘地点’:[‘圣地亚哥’、‘纽约’、‘纽约’、‘圣地亚哥’、‘圣地亚哥’,
“纽约”]
})
le=预处理。LabelEncoder()
勒菲特(df)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/bbalin/anaconda/lib/python2.7/site packages/sklearn/preprocessing/label.py”,第103行
y=列_或_1d(y,警告=真)
文件“/Users/bbalin/anaconda/lib/python2.7/site packages/sklearn/utils/validation.py”,第306行,在第_或_1d列中
raise VALUERROR(“错误的输入形状{0}”。格式(形状))
ValueError:输入形状不正确(6,3)
有没有关于如何解决这个问题的想法
你可以很容易地做到这一点
df.apply(LabelEncoder().fit\u变换)
编辑2:
在scikit学习0.20中,推荐的方法是
OneHotEncoder().fit_变换(df)
因为OneHotEncoder现在支持字符串输入。
ColumnTransformer可以仅将OneHotEncoder应用于某些列
编辑:
既然这个最初的答案是一年多以前的,并且获得了很多选票(包括悬赏),我可能应该进一步扩展这个答案
对于逆_变换和变换,您需要做一些修改
从集合导入defaultdict
d=默认DICT(标签编码)
这样,您现在可以将所有列LabelEncoder保留为字典
对变量进行编码
fit=df.apply(λx:d[x.name].fit_变换(x))
#逆编码
fit.apply(lambda x:d[x.name].反变换(x))
#使用字典标记未来数据
df.apply(lambda x:d[x.name].transform(x))
MOAR编辑:
使用NeuralAxix的FlatteForEach步骤,可以同时对所有展平数据使用相同的LabelEncoder:
flattforeach(LabelEncoder(),然后\u unflatten=True)。拟合变换(df)
对于根据数据列使用单独的LabelEncoders,或者如果只需要对部分数据列进行标签编码而不需要对其他列进行标签编码,则使用ColumnTransformer是一种解决方案,它允许对列选择和LabelEncoder实例进行更多控制