如何在RDD的不同列中进行onehotencoder?

时间:2018-07-02 10:42:58

标签: python apache-spark scikit-learn rdd one-hot-encoding

我尝试对不同的列执行onehotencoder,例如以下代码。列是保存列索引的列表。方法updateCode(x, dict_label2code, column+offSet)用于用代码替换类别。新的RDD中的行长度增加了,因为代码长度必须大于1。 列中的第一列可以成功编码。但是,运行到第二次for循环时,'print rdd.take(2)'会出错。

欢迎提出任何建议。

    def replaceNull(x):
        if x == '':
            x='none_value'
        return x

    def scOneHotEncoder(rdd, columns):
        from sklearn.preprocessing import OneHotEncoder
        from sklearn.preprocessing import LabelEncoder
        offset = 0
        values = rdd.map(lambda x:x[column+offSet]).map(lambda x:replaceNull(x)).distinct().collect()
        for column in columns:

            print rdd.take(2)   # for testing.
            # 
            # There are many codes here to get the dict_label2code which is a dict type, the key is the category of column+offset, and the value is the code.
            #
            rdd = rdd.map(lambda x:updateCode(x, dict_label2code, column+offSet))
            print rdd.take(5)    # for testing.
            offSet = offSet + len(values) - 1

        return rdd

0 个答案:

没有答案