如何基于列表指定列过滤DataFrame(多列值均大于阈值)
解决方案:过滤指定列全部大于3的行
这需求其实很直观——就是要确保targetList里的每一列值都满足大于3的条件,我们可以通过动态生成过滤条件再合并的方式实现,不管列表里有多少列都能通用。
Scala 实现
假设你用的是Scala版本的Spark,代码如下:
import org.apache.spark.sql.functions.col // 基于已定义的targetList生成所有列的过滤条件,并合并为逻辑与 val filterConditions = targetList.map(col(_) > 3).reduce(_ && _) // 应用过滤条件得到结果DataFrame val filteredDf = df.filter(filterConditions)
逻辑说明:
- 先用
map遍历targetList,把每个列名转换成列 > 3的布尔条件 - 再用
reduce把所有条件用&&(逻辑与)合并,相当于所有条件必须同时满足 - 最后用
filter方法过滤DataFrame
Python 实现
如果是Python版本的Spark,写法类似,注意需要导入functools.reduce来合并条件:
from functools import reduce from pyspark.sql.functions import col # 生成每一列的过滤条件列表 filter_conditions = [col(c) > 3 for c in targetList] # 合并所有条件为逻辑与,然后过滤 filtered_df = df.filter(reduce(lambda cond1, cond2: cond1 & cond2, filter_conditions))
效果验证
针对你给出的示例DataFrame,运行代码后,只有第二行(WEEK=2016-04-30)会被保留,因为它的T1_diff=90和T2_diff=4都大于3,完全符合要求。
内容的提问来源于stack exchange,提问作者White Shadows
相关产品推荐
相关产品推荐

