Pyspark:根据列名列表过滤数据框

时间:2021-03-25 11:19:20

标签: python dataframe apache-spark pyspark apache-spark-sql

我正在寻找一种干净的方法来解决以下问题:我想过滤一个数据框,使其仅包含至少为预定义的列名列表填充了一个值的行。

我不想做的是单独列出所有条件:

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

我的解决方案有其他替代方案吗?

2 个答案:

答案 0 :(得分:2)

您也可以使用 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)))

答案 1 :(得分:1)

如果指定子集中的所有列都为空,您可以使用 dropna 并指定 how='all' 删除行:

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