我正在使用Zeppelin,df
是Spark DataFrame。我尝试过滤任何行中可能出现的NaN,但由于某种原因它不会过滤掉它。
val df = df_labeled("df_Germany")
df: org.apache.spark.sql.DataFrame = [Kik: string, Lak: string ... 15 more fields]
df.count()
res66: Long = 455
df.na.drop().count
res66: Long = 455
如何一次过滤所有NaN?
答案 0 :(得分:1)
如何一次过滤所有NaN?
一般来说应该工作
df.na.drop
但可以替代在每个可以为NaN 的列上使用 .isNaN
函数。我们知道在Floats和Doubles 中可以使用 NaN值,因此我们需要获取具有DoubleType或FloatType的列名作为dataTypes 并执行{{1}作为
filter
或者你可以使用isnan内置函数
import org.apache.spark.sql.functions._
val nan_columns = df.schema.filter(x => x.dataType == DoubleType || x.dataType == FloatType).map(_.name)
df.filter(!nan_columns.map(col(_).isNaN).reduce(_ or _))
答案 1 :(得分:0)
假设df是您的数据帧。如果要删除任何列中的NaN值的所有行(在任何列中)。你可以使用
df.na.drop
如果要使用某些值填充所有NaN值,可以使用
df.na.fill(your_value)
在多列
上val cols = Seq("col1","col2")
df.na.drop(cols)
但如果你想按列进行,你可以做
df.filter(!$"col_name".isNaN)
或者
df.filter(!isnan($"your_column"))