我正在寻找一种干净的方法来解决以下问题:我想过滤一个数据框,使其仅包含至少为预定义的列名列表填充了一个值的行。
我不想做的是单独列出所有条件:
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))
我的解决方案有其他替代方案吗?
答案 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)