2016-11-17 15 views
1

カラム名のリストがあり、それらのカラムの値がゼロより大きい場合にローをフィルタリングしたい場合は、これに似たものがありますか?PySpark Dataframes:複数の条件をコンパクトコードでフィルタリングする方法は?

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

これが返されます。

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions

を私は負の数を持っていないので、私は(1列のみにこれらの列とフィルタを合計することができます。しかし、私は和トリックwouldnを持っていた場合は推測します。私は合計よりも異なる別の条件でこれらの列をフィルタリングするために持っていた場合はとにかく「トン仕事と、どのように私は私がやりたいことができ 任意のアイデア

答えて

2

代わりor_演算子を使用することができます。??

from operator import or_ 
from functools import reduce 

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

EDIT:もっと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])) 

EDIT 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| 
# +---+---+---+ 
+0

それはよりpythonista/pandistaソリューションはよりよいだっただろうにもかかわらず、動作します、それが存在する場合。 – foebu

+0

@foebuは私の答えを更新しました – eliasah

+0

は 'lit'で' list'ですか?もしそうなら、私は 'bool object not iterable'を取得します。私は2番目のソリューションを動作させることはできません。 – foebu

関連する問題