开发者社区> 问答> 正文

从Spark中的一个热编码列中删除级别

如果我已经有一个由OneHotEncoderEstimator创建的列,我怎么能动态删除其中一个级别?

假设您有一个包含4个级别的列(一个因为依赖而丢弃),并且您希望删除第二级(即将其置于拦截中)。

所以,从类似的东西

row, fruit , encoded
1 , apple , [1, 0, 0]
2 , orange, [0, 1 ,0]
3 , pear , [0, 0, 1]

row, fruit , encoded
1 , apple , [1, 0]
2 , orange, [0, 1]
3 , pear , [0, 0]
面临的挑战之一是,OneHotEncoderEstimator返回 SparseVector 的每一行。我甚至不确定如何删除向量的“正确”索引,因为我所拥有的只是列名和级别。

我知道我可以删除行并重新编码,但我正在努力避免这种情况。

有谁知道如何在Python / Spark 2.3中做到这一点?

展开
收起
社区小助手 2018-12-19 15:48:04 1847 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    先创建这个DataFrame。

    myValues = [(1,'apple',[1,0,0]),(2,'orange',[0,1,0]),(3,'pear',[0,0,1])]
    df = sqlContext.createDataFrame(myValues,['row','fruit','encoded'])

    df.show()
    rowfruitencoded
    1apple[1,0,0]
    2orange[0,1,0]
    3pear[0,0,1]

    现在,让我们删除第3个元素。size() - 它返回存储在列中的数组或列表的长度。

    from pyspark.sql.functions import size
    df = df.withColumn('encoded', df.encoded[:size(df.encoded)-1])

    df.show()
    rowfruitencoded
    1apple[1,0]
    2orange[0,1]
    3pear[0,0]

    +----+----------+--------+

    2019-07-17 23:22:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载