PySpark Dataframes:如何使用紧凑代码在多种条件下进行过滤?

loading...


1

如果我有一个列名列表,并且如果这些列的值大于零,我想对行进行过滤,是否可以执行类似的操作?

columns = ['colA','colB','colC','colD','colE','colF']
new_df = df.filter(any([df[c]>0 for c in columns]))

返回:

ValueError:无法将列转换为布尔值:请对“和”,“ |”使用“&”构建 DataFrame 布尔表达式时为'or',为'~'为'not'

我想我只能将这些列和过滤器加到一个列上(因为我没有负数。但是如果我有 sum-trick 就行不通。无论如何,如果我不得不在不同于该列的另一种条件下过滤这些列总之,我该怎么做我想做的事?

loading...

1回答

  • 2

    您可以改用or_运算符:

    from operator import or_
    from functools import reduce
    
    newdf = df.where(reduce(or_, (df[c] > 0 for c in df.columns)))
    

    **编辑:**更多 pythonista 解决方案:

    from pyspark.sql.functions import lit
    
    def any_(*preds):
        cond = lit(False)
        for pred in preds:
            cond = cond | pred
        return cond
    
    newdf = df.where(any_(*[df[c] > 0 for c in df.columns]))
    

    **编辑 2:**完整示例:

    Welcome to
          ____              __
         / __/__  ___ _____/ /__
        _\ \/ _ \/ _ `/ __/  '_/
       /__ / .__/\_,_/_/ /_/\_\   version 2.1.0-SNAPSHOT
          /_/
    
    Using Python version 3.5.1 (default, Dec  7 2015 11:16:01)
    SparkSession available as 'spark'.
    
    In [1]: from pyspark.sql.functions import lit
    
    In [2]: %pas
    %paste     %pastebin  
    
    In [2]: %paste
    def any_(*preds):
        cond = lit(False)
        for pred in preds:
            cond = cond | pred
        return cond
    
    ## -- End pasted text --
    
    In [3]: df = sc.parallelize([(1, 2, 3), (-1, -2, -3), (1, -1, 0)]).toDF()
    
    In [4]: df.where(any_(*[df[c] > 0 for c in df.columns])).show()
    # +---+---+---+
    # | _1| _2| _3|
    # +---+---+---+
    # |  1|  2|  3|
    # |  1| -1|  0|
    # +---+---+---+
    
    In [5]: df[any_(*[df[c] > 0 for c in df.columns])].show()
    # +---+---+---+
    # | _1| _2| _3|
    # +---+---+---+
    # |  1|  2|  3|
    # |  1| -1|  0|
    # +---+---+---+
    
    In [6]: df.show()
    # +---+---+---+
    # | _1| _2| _3|
    # +---+---+---+
    # |  1|  2|  3|
    # | -1| -2| -3|
    # |  1| -1|  0|
    # +---+---+---+
    
评论

暂时没有评论!