正如拉斯曼所提到的,LabelEncoder()只接受一个一维数组作为参数。..这就是说,很容易滚动您自己选择的多列的标签编码器,并返回转换后的数据。我这里的代码部分是基于Zac Stewart的优秀博客文章这里.
创建自定义编码器只需创建一个响应于fit()
, transform()
,和fit_transform()
方法。在你的例子中,一个好的开端可能是这样的:
import pandas as pdfrom sklearn.preprocessing import LabelEncoderfrom sklearn.pipeline import Pipeline# Create some toy data in a Pandas dataframefruit_data = pd.DataFrame({
'fruit': ['apple','orange','pear','orange'],
'color': ['red','orange','green','green'],
'weight': [5,6,3,4]})class MultiColumnLabelEncoder:
def __init__(self,columns = None):
self.columns = columns # array of column names to encode
def fit(self,X,y=None):
return self # not relevant here
def transform(self,X):
'''
Transforms columns of X specified in self.columns using
LabelEncoder(). If no columns specified, transforms all
columns in X.
'''
output = X.copy()
if self.columns is not None:
for col in self.columns:
output[col] = LabelEncoder().fit_transform(output[col])
else:
for colname,col in output.iteritems():
output[colname] = LabelEncoder().fit_transform(col)
return output def fit_transform(self,X,y=None):
return self.fit(X,y).transform(X)
假设我们要编码我们的两个分类属性(fruit
和color
),同时保留数字属性。weight
独自一人。我们可以这样做:
MultiColumnLabelEncoder(columns = ['fruit','color']).fit_transform(fruit_data)
这改变了我们fruit_data
数据集
传递一个完全由分类变量组成的数据文件,并省略columns
参数将导致对每一列进行编码(我认为这是您最初要查找的):
MultiColumnLabelEncoder().fit_transform(fruit_data.drop('weight',axis=1))
这转换
注意,当它试图对已经是数字的属性进行编码时可能会阻塞(如果您愿意的话,可以添加一些代码来处理这个问题)。
这方面的另一个好特性是,我们可以在管道中使用这个自定义转换器:
encoding_pipeline = Pipeline([
('encoding',MultiColumnLabelEncoder(columns=['fruit','color']))
# add more pipeline steps as needed])encoding_pipeline.fit_transform(fruit_data)