将条件应用于列列表的数据框过滤

Posted

技术标签:

【中文标题】将条件应用于列列表的数据框过滤【英文标题】:Dataframe filtering with condition applied to list of columns 【发布时间】:2019-09-08 04:02:59 【问题描述】:

如果列表中的任何字符串列为空,我想过滤 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.

【问题讨论】:

【参考方案1】:

你可以像这样使用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()

【讨论】:

【参考方案2】:

由于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) 值,而不是空字符串。

【讨论】:

以上是关于将条件应用于列列表的数据框过滤的主要内容,如果未能解决你的问题,请参考以下文章

将过滤器列表应用于来自使用 pandas 的列表的数据框

如何将 dplyr 过滤器应用于数据框列表?

多个条件的过滤列表

[R]:根据条件行位置将函数应用于列

将多个正则表达式应用于 DataTable 列

在 R dplyr 中过滤具有多个条件名称匹配的数据框