Dataframe 从pyspark数据帧筛选负值

Dataframe 从pyspark数据帧筛选负值,dataframe,filter,pyspark,Dataframe,Filter,Pyspark,我有一个spark dataframe,其中包含超过40列的混合值。如何一次仅从所有列中选择正值并过滤掉负值?我访问了[但没有一个解决方案有效。我想在pyspark中使用Naive Bayes,其中一个假设是所有功能都必须为正值。我如何通过仅从功能中选择正值来准备相同的数据?假设您有这样一个数据框 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,

我有一个spark dataframe,其中包含超过40列的混合值。如何一次仅从所有列中选择正值并过滤掉负值?我访问了[但没有一个解决方案有效。我想在pyspark中使用Naive Bayes,其中一个假设是所有功能都必须为正值。我如何通过仅从功能中选择正值来准备相同的数据?

假设您有这样一个数据框

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()

不工作&失败,出现多个错误。我有4个分类列,我正在对它们进行编码。transformer.transform()不适用于此。BooleanType()也未定义。我已添加booleantype的导入语句。此逻辑仅在具有数字预测器时才有效。一旦对分类类型进行编码,它将有效。您应该发布数据示例。
+-----+--------------------+
|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,...|
+-----+--------------------+