Python Pyspark:基于列名列表筛选数据帧
我正在寻找一种干净的方法来解决以下问题:我想过滤一个数据帧,使其只包含至少有一个值填充到预定义列名列表中的行 我不想单独列出所有条件,如下所示:Python Pyspark:基于列名列表筛选数据帧,python,dataframe,apache-spark,pyspark,apache-spark-sql,Python,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我正在寻找一种干净的方法来解决以下问题:我想过滤一个数据帧,使其只包含至少有一个值填充到预定义列名列表中的行 我不想单独列出所有条件,如下所示: df.where(col('col1').isNotNull() | col('col2').isNotNull() | ...) 这种方法是不可行的,因为列名列表可能会变得相当大,并且可能会经常更改 我现在的解决方案是在一个单独的函数中组合条件: def compose_condition(col_names): condition = Fa
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))
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)))
我的解决方案还有其他选择吗?如果指定子集中的所有列都为空,则可以使用
dropna
并指定how='all'
删除行:
df2 = df.dropna(how='all', subset=my_col_names)
如果指定子集中的所有列都为空,则可以使用
dropna
并指定how='all'
删除行:
df2 = df.dropna(how='all', subset=my_col_names)
您还可以使用python
functools.reduce
将列名列表缩减为筛选条件:
my_col_names = ['col1', 'col2', 'col3']
df.where(compose_condition(my_col_names))
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)))
您还可以使用python
functools.reduce
将列名列表缩减为筛选条件:
my_col_names = ['col1', 'col2', 'col3']
df.where(compose_condition(my_col_names))
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)))