Python sklearn pandas同时转换多个列错误



我正在使用带有pandassklearn的python,并尝试使用新的非常方便的sklearn-pandas

我有一个大的数据帧,需要以类似的方式转换多个列。

变量other中有多个列名此处的源代码文档明确指出,有可能使用相同的转换转换多个列,但以下代码的行为与预期不符:

from sklearn.preprocessing import MinMaxScaler, LabelEncoder
mapper = DataFrameMapper([[other[0],other[1]],LabelEncoder()])
mapper.fit_transform(df.copy())

我得到以下错误:

引发ValueError("错误的输入形状{0}".format(shape))ValueError:[EFW','BPD']:错误的输入形状(154,2)

当我使用以下代码时,它非常有效:

cols = [(other[i], LabelEncoder()) for i,col in enumerate(other)]
mapper = DataFrameMapper(cols)
mapper.fit_transform(df.copy())

据我所知,两者应该都能很好地发挥作用,并产生相同的结果。我在这里做错了什么?

谢谢!

您在这里遇到的问题是,这两段代码在数据结构方面完全不同。

cols = [(other[i], LabelEncoder()) for i,col in enumerate(other)]构建元组列表。请注意,您可以将这行代码缩短为:

cols = [(col, LabelEncoder()) for col in other]

无论如何,第一个片段[[other[0],other[1]],LabelEncoder()]产生了一个包含两个元素的列表:一个列表和一个LabelEncoder实例。现在,有文档表明,您可以通过指定来转换多个列

转换可能需要多个输入列。在这些情况下,可以在列表中指定列名:

mapper2=DataFrameMapper([(儿童,工资,sklearn.分解.PCA(1))])

这是一个包含tuple(list, object)结构化元素的list,而不是list[list, object]结构化元素。

如果我们看看源代码本身,

class DataFrameMapper(BaseEstimator, TransformerMixin):
"""
Map Pandas data frame column subsets to their own
sklearn transformation.
"""
def __init__(self, features, default=False, sparse=False, df_out=False,
input_df=False):
"""
Params:
features    a list of tuples with features definitions.
The first element is the pandas column selector. This can
be a string (for one column) or a list of strings.
The second element is an object that supports
sklearn's transform interface, or a list of such objects.
The third element is optional and, if present, must be
a dictionary with the options to apply to the
transformation. Example: {'alias': 'day_of_week'}

在类定义中也明确指出,DataFrameMapper的features参数需要是元组的列表,其中元组的元素可以是列表。

最后一点要注意的是,为什么会收到错误消息:sklearn中的LabelEncoder转换器用于在1D阵列上进行标记。因此,它根本无法同时处理2列,并将引发异常。因此,如果您想使用LabelEncoder,您必须构建具有1个列名和转换器的N个元组,其中N是您希望转换的列数。

相关内容

  • 没有找到相关文章

最新更新