将条件应用于列列表的数据框过滤
Dataframe filtering with condition applied to list of columns
如果列表中的任何字符串列为空,我想过滤 pyspark 数据框。
df = df.where(all([col(x)!='' for x in col_list]))
ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.
您可以使用 functools
中的 reduce
来模拟 all
像这样
from functools import reduce
spark_df.where(reduce(lambda x, y: x & y, (F.col(x) != '' for x in col_list))).show()
由于filter
(或where
)是惰性评估转换,我们可以通过一个一个地应用它们来合并多个条件,例如
for c in col_list:
spark_df = spark_df.filter(col(c) != "")
spark_df.show()
这可能会更易读一些,但最终它会以与 Sreeram 的答案完全相同的方式执行。
附带说明,删除具有空值的行最常使用
df.na.drop(how="any", subset=col_list)
但它只处理缺失的 (null / None) 值,不处理空字符串。
如果列表中的任何字符串列为空,我想过滤 pyspark 数据框。
df = df.where(all([col(x)!='' for x in col_list]))
ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.
您可以使用 functools
中的 reduce
来模拟 all
像这样
from functools import reduce
spark_df.where(reduce(lambda x, y: x & y, (F.col(x) != '' for x in col_list))).show()
由于filter
(或where
)是惰性评估转换,我们可以通过一个一个地应用它们来合并多个条件,例如
for c in col_list:
spark_df = spark_df.filter(col(c) != "")
spark_df.show()
这可能会更易读一些,但最终它会以与 Sreeram 的答案完全相同的方式执行。
附带说明,删除具有空值的行最常使用
df.na.drop(how="any", subset=col_list)
但它只处理缺失的 (null / None) 值,不处理空字符串。