如何用PySpark移除含至少一个字符串NA的所有DataFrame行?
PySpark移除含"NA"字符串的行(全列处理)
问题描述
我有一个PySpark DataFrame,想要移除其中包含至少一个"NA"字符串的所有行。目前只会针对单个列处理的方法,想知道如何对DataFrame的所有列执行该操作。
可复现代码示例
# 导入模块 from pyspark.sql import SparkSession from pyspark import SparkContext from pyspark.sql.functions import col from pyspark.sql import Row # 初始化SparkContext SparkContext.getOrCreate() # 初始化SparkSession spark = SparkSession \ .builder \ .master("local") \ .appName("Introduction au DataFrame") \ .getOrCreate() # 创建DataFrame values = [("1","2","3"), ("NA","1", "2"), ("4", "NA", "1")] columns = ['var1', 'var2', 'var3'] df = spark.createDataFrame(values, columns) # 初始DataFrame df.show() # +----+----+----+ # |var1|var2|var3| # +----+----+----+ # | 1| 2| 3| # | NA| 1| 2| # | 4| NA| 1| # +----+----+----+ # 过滤var1列不含"NA"的行(仅单列处理) df.where(~col('var1').contains('NA')).show() # +----+----+----+ # |var1|var2|var3| # +----+----+----+ # | 1| 2| 3| # | 4| NA| 1| # +----+----+----+
预期输出
+----+----+----+ |var1|var2|var3| +----+----+----+ | 1| 2| 3| +----+----+----+
已尝试的无效方法
我试过以下方法,但发现PySpark只识别原生null值,不把字符串"NA"当作缺失值处理:
df.na.drop().show() df.select([count(when(isnan('var1'), True))]).show() df.filter(df['var1'].isNotNull()).show()
解决方案
核心问题是:DataFrame中的"NA"是字符串类型,而PySpark的na.drop()、isNotNull()等方法只处理原生的null值,所以直接用这些方法无效。下面提供两种可行方案:
方案1:生成全列过滤条件
遍历所有列,对每一列添加"不含NA字符串"的条件,然后用all()组合所有条件,过滤出所有列都不含"NA"的行:
from pyspark.sql.functions import col, all # 生成所有列的过滤条件:每一列都不包含"NA" filter_condition = all(~col(c).contains("NA") for c in df.columns) # 应用过滤条件 filtered_df = df.where(filter_condition) filtered_df.show()
方案2:先将"NA"转为null再删除
先把所有列中的"NA"字符串替换成PySpark原生的null,再用na.drop()删除任何含null的行:
# 将所有列中的"NA"替换为null,然后删除含null的行 filtered_df = df.replace("NA", None).na.drop() filtered_df.show()
两种方案执行后,都会得到你想要的预期输出。
内容的提问来源于stack exchange,提问作者Yacine Hajji
相关产品推荐
相关产品推荐

