pyspark:基于列名列表过滤Dataframe

j13ufse2  于 2021-07-09  发布在  Spark
关注(0)|答案(2)|浏览(386)

我正在寻找一种干净的方法来解决以下问题:我希望过滤一个Dataframe,使其只包含至少为预定义的列名列表填充了一个值的行。
我不想单独列出所有条件:

df.where(col('col1').isNotNull() | col('col2').isNotNull() | ...)

这种方法是不可行的,因为列名列表可能会变得非常大,并且可能经常更改。
我现在的解决方案是将条件组合到一个单独的函数中:

def compose_condition(col_names):
   condition = False
   for col_name in col_names:
      condition = condition | col(col_name).isNotNull()
   return condition

然后将此函数的结果用作过滤条件:

my_col_names = ['col1', 'col2', 'col3']
df.where(compose_condition(my_col_names))

我的解决方案还有别的选择吗?

csbfibhn

csbfibhn1#

你可以用 dropna 并具体说明 how='all' 要在指定子集中的所有列都为空时删除行,请执行以下操作:

df2 = df.dropna(how='all', subset=my_col_names)
qoefvg9y

qoefvg9y2#

也可以使用python functools.reduce 要将列名列表缩减为筛选条件,请执行以下操作:

from functools import reduce
from pyspark.sql.functions import col

df.where(reduce(lambda a, b: a.isNotNull() | b.isNotNull(), map(col, my_col_names)))

相关问题