如何在PySpark中筛选非全0列及NA占比超0.5的列?
问题1:获取PySpark DataFrame中值不全为0.0的所有列
通过统计每列非0值的数量,筛选出非0值数量大于0的列即可:
from pyspark.sql import functions as F # 统计每列非0值的行数 non_zero_counts = df.agg( *[F.sum(F.when(F.col(c) != 0.0, 1)).alias(c) for c in df.columns] ).collect()[0] # 筛选出不全为0的列名 non_all_zero_cols = [col for col, count in non_zero_counts.asDict().items() if count > 0] # 生成只包含目标列的新DataFrame filtered_df = df.select(non_all_zero_cols)
问题2:筛选NA值(字符串"NA")占比大于0.5的列
基于你已生成的df_nan_values(一行多列的占比结果),可以将其转为字典后筛选符合条件的列:
# 将单行占比结果转为字典 nan_ratio_dict = df_nan_values.collect()[0].asDict() # 筛选出占比超过0.5的列名 high_nan_cols = [col for col, ratio in nan_ratio_dict.items() if ratio > 0.5] # 示例:删除这些高NA占比列 # df_cleaned = df.drop(*high_nan_cols)
如果想一步完成计算与筛选,也可以合并步骤:
from pyspark.sql import functions as F # 计算占比并直接筛选 nan_ratios = df.agg( *[(F.count(F.when(F.col(c) == "NA", c)) / F.count(c)).alias(c) for c in df.columns] ).collect()[0].asDict() high_nan_cols = [col for col, ratio in nan_ratios.items() if ratio > 0.5]
内容的提问来源于stack exchange,提问作者sj6266
相关产品推荐
相关产品推荐

