如果列表中的任何字符串列为空,我想过滤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.
答案 0 :(得分:2)
您可以使用reduce
中的functools
来模拟all
,
from functools import reduce
spark_df.where(reduce(lambda x, y: x & y, (F.col(x) != '' for x in col_list))).show()
答案 1 :(得分:0)
由于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)值,而不处理空字符串。