【问题标题】:Filter negative values from a pyspark dataframe从 pyspark 数据框中过滤负值
【发布时间】:2018-03-19 17:28:16
【问题描述】:

我有一个包含 >40 列的混合值的 spark 数据框。如何一次只从所有列中选择正值并过滤掉负值?我访问了 [Python Pandas: DataFrame filter negative values,但没有一个解决方案有效。我想在 pyspark 中拟合朴素贝叶斯,其中一个假设是所有特征都必须是积极的。如何通过仅从我的特征中选择正值来准备相同的数据?

【问题讨论】:

    标签: dataframe filter pyspark


    【解决方案1】:

    假设你有一个这样的数据框

    data = [(0,-1,3,4,5, 'a'), (0,-1,3,-4,5, 'b'), (5,1,3,4,5, 'c'), 
            (10,1,13,14,5,'a'),(7,1,3,4,2,'b'), (0,1,23,4,-5,'c')]
    df = sc.parallelize(data).toDF(['f1', 'f2','f3','f4', 'f5', 'class'])
    

    使用VectorAssembler 将所有列组合到一个向量中。

    from pyspark.ml.feature import VectorAssembler
    
    transformer = VectorAssembler(inputCols =['f1','f2','f3','f4','f5'], outputCol='features')
    df2 = transformer.transform(df)
    

    现在,使用 udf 过滤数据框

    from pyspark.sql.types import *
    foo = udf(lambda x: not np.any(np.array(x)<0), BooleanType())
    df2.drop('f1','f2','f3','f4','f5').filter(foo('features')).show()
    

    结果

    +-----+--------------------+
    |class|            features|
    +-----+--------------------+
    |    c|[5.0,1.0,3.0,4.0,...|
    |    a|[10.0,1.0,13.0,14...|
    |    b|[7.0,1.0,3.0,4.0,...|
    +-----+--------------------+
    

    【讨论】:

    • 无法正常工作并因多个错误而失败。我有 4 个分类列,我正在对它们进行编码。 transformer.transform() 不适用于此。 BooleanType() 也没有定义。
    • 我添加了布尔类型的导入语句。仅当您有数字预测变量时,此逻辑才有效。一旦你对分类类型进行编码,它就会起作用。
    • 您应该发布您的数据样本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2019-03-07
    相关资源
    最近更新 更多