如何根据列包含的值过滤 spark Dataframe?
How can I filter spark Dataframe according to the value that column contains?
在数据集中,我有一些字符串列的 None 或 NA 值,我想计算数据集中包含多少这些空值?根据该决定使用哪种方法来处理缺失值。
我尝试了一种非常有效的方法来使用或表达式为每一列过滤 Dataframe。我想以更高效、更整洁的方式过滤它们。不转成rdd会更好,但是如果不能用dataframe做这种过滤rdd的方式也是可以接受的。
我发现这个帖子 与我的问题非常相似,但我想要一种更简洁优雅的方式来编写它,因为我有很多专栏
// trainDataFull is my dataframe
val nullValues = Array("NA", "None")
val filtered = trainDataFull.filter(trainDataFull("Alley").isin(nullValues:_*) ||
trainDataFull("MSZoning").isin(nullValues:_*) ||
trainDataFull("Street").isin(nullValues:_*) ||
trainDataFull("LotShape").isin(nullValues:_*) ||
trainDataFull("LandContour").isin(nullValues:_*) ||
trainDataFull("Utilities").isin(nullValues:_*) ||
trainDataFull("LotConfig").isin(nullValues:_*) ||
trainDataFull("LandSlope").isin(nullValues:_*) ||
trainDataFull("Neighborhood").isin(nullValues:_*) ||
trainDataFull("Condition1").isin(nullValues:_*) ||
trainDataFull("Condition2").isin(nullValues:_*) ||
trainDataFull("BldgType").isin(nullValues:_*) ||
trainDataFull("HouseStyle").isin(nullValues:_*) ||
trainDataFull("RoofStyle").isin(nullValues:_*) ||
trainDataFull("RoofMatl").isin(nullValues:_*) ||
trainDataFull("Exterior1st").isin(nullValues:_*) ||
trainDataFull("Exterior2nd").isin(nullValues:_*) ||
trainDataFull("MasVnrType").isin(nullValues:_*) ||
trainDataFull("MasVnrArea").isin(nullValues:_*) ||
trainDataFull("ExterQual").isin(nullValues:_*) ||
trainDataFull("MasVnrArea").isin(nullValues:_*) ||
trainDataFull("ExterQual").isin(nullValues:_*) ||
trainDataFull("ExterCond").isin(nullValues:_*) ||
trainDataFull("Foundation").isin(nullValues:_*) ||
trainDataFull("BsmtQual").isin(nullValues:_*) ||
trainDataFull("BsmtCond").isin(nullValues:_*) ||
trainDataFull("BsmtExposure").isin(nullValues:_*)
)
我想看看哪一列有多少空值。
您始终可以通过编程方式生成查询
val nullValues = Array("NA", "None")
val df = Seq(("NA", "Foo"), ("None", "NA")).toDF("MSZoning", "Street")
val columns = df.schema.collect {
case StructField(name, StringType, _, _) =>
sum(when(col(name).isInCollection(nullValues), 1)).as(name)
}
df.select(columns:_*).show()
输出:
+--------+------+
|MSZoning|Street|
+--------+------+
| 2| 1|
+--------+------+
在数据集中,我有一些字符串列的 None 或 NA 值,我想计算数据集中包含多少这些空值?根据该决定使用哪种方法来处理缺失值。
我尝试了一种非常有效的方法来使用或表达式为每一列过滤 Dataframe。我想以更高效、更整洁的方式过滤它们。不转成rdd会更好,但是如果不能用dataframe做这种过滤rdd的方式也是可以接受的。
我发现这个帖子
// trainDataFull is my dataframe
val nullValues = Array("NA", "None")
val filtered = trainDataFull.filter(trainDataFull("Alley").isin(nullValues:_*) ||
trainDataFull("MSZoning").isin(nullValues:_*) ||
trainDataFull("Street").isin(nullValues:_*) ||
trainDataFull("LotShape").isin(nullValues:_*) ||
trainDataFull("LandContour").isin(nullValues:_*) ||
trainDataFull("Utilities").isin(nullValues:_*) ||
trainDataFull("LotConfig").isin(nullValues:_*) ||
trainDataFull("LandSlope").isin(nullValues:_*) ||
trainDataFull("Neighborhood").isin(nullValues:_*) ||
trainDataFull("Condition1").isin(nullValues:_*) ||
trainDataFull("Condition2").isin(nullValues:_*) ||
trainDataFull("BldgType").isin(nullValues:_*) ||
trainDataFull("HouseStyle").isin(nullValues:_*) ||
trainDataFull("RoofStyle").isin(nullValues:_*) ||
trainDataFull("RoofMatl").isin(nullValues:_*) ||
trainDataFull("Exterior1st").isin(nullValues:_*) ||
trainDataFull("Exterior2nd").isin(nullValues:_*) ||
trainDataFull("MasVnrType").isin(nullValues:_*) ||
trainDataFull("MasVnrArea").isin(nullValues:_*) ||
trainDataFull("ExterQual").isin(nullValues:_*) ||
trainDataFull("MasVnrArea").isin(nullValues:_*) ||
trainDataFull("ExterQual").isin(nullValues:_*) ||
trainDataFull("ExterCond").isin(nullValues:_*) ||
trainDataFull("Foundation").isin(nullValues:_*) ||
trainDataFull("BsmtQual").isin(nullValues:_*) ||
trainDataFull("BsmtCond").isin(nullValues:_*) ||
trainDataFull("BsmtExposure").isin(nullValues:_*)
)
我想看看哪一列有多少空值。
您始终可以通过编程方式生成查询
val nullValues = Array("NA", "None")
val df = Seq(("NA", "Foo"), ("None", "NA")).toDF("MSZoning", "Street")
val columns = df.schema.collect {
case StructField(name, StringType, _, _) =>
sum(when(col(name).isInCollection(nullValues), 1)).as(name)
}
df.select(columns:_*).show()
输出:
+--------+------+
|MSZoning|Street|
+--------+------+
| 2| 1|
+--------+------+