如何替换 DataFrame 列中的空值?

How to replace empty values in a column of DataFrame?

如何替换 DataFrame df 的列 Field1 中的空值?

Field1 Field2
       AA
12     BB

此命令未提供预期结果:

df.na.fill("Field1",Seq("Anonymous"))

预期结果:

Field1          Field2
Anonymous       AA
12              BB

Fill: Returns a new DataFrame that replaces null or NaN values in numeric columns with value.

两件事:

  1. 空字符串不是 null 或 NaN,因此您必须为此使用 case 语句。
  2. 将文本值赋给数字列时,Fill 似乎无法正常工作。

用填充/文本替换空值失败:

scala> a.show
+----+---+
|  f1| f2|
+----+---+
|null| AA|
|  12| BB|
+----+---+

scala> a.na.fill("Anonymous", Seq("f1")).show
+----+---+
|  f1| f2|
+----+---+
|null| AA|
|  12| BB|
+----+---+

工作示例 - 对所有数字使用 Null:

scala> a.show
+----+---+
|  f1| f2|
+----+---+
|null| AA|
|  12| BB|
+----+---+


scala> a.na.fill(1, Seq("f1")).show
+---+---+
| f1| f2|
+---+---+
|  1| AA|
| 12| BB|
+---+---+

失败示例(空字符串而不是 Null):

scala> b.show
+---+---+
| f1| f2|
+---+---+
|   | AA|
| 12| BB|
+---+---+


scala> b.na.fill(1, Seq("f1")).show
+---+---+
| f1| f2|
+---+---+
|   | AA|
| 12| BB|
+---+---+

案例语句修复示例:

scala> b.show
+---+---+
| f1| f2|
+---+---+
|   | AA|
| 12| BB|
+---+---+


scala> b.select(when(col("f1") === "", "Anonymous").otherwise(col("f1")).as("f1"), col("f2")).show
+---------+---+
|       f1| f2|
+---------+---+
|Anonymous| AA|
|       12| BB|
+---------+---+

你也可以试试这个。 这可能同时处理 blank/empty/null

df.show()
+------+------+
|Field1|Field2|
+------+------+
|      |    AA|
|    12|    BB|
|    12|  null|
+------+------+

df.na.replace(Seq("Field1","Field2"),Map(""-> null)).na.fill("Anonymous", Seq("Field2","Field1")).show(false)   

+---------+---------+
|Field1   |Field2   |
+---------+---------+
|Anonymous|AA       |
|12       |BB       |
|12       |Anonymous|
+---------+---------+   

当数据框中有 n 个列时,您可以尝试使用以下代码。

注意:当您尝试将数据写入镶木地板等格式时,不支持空数据类型。我们必须对其进行类型转换。

val df = Seq(
(1, ""),
(2, "Ram"),
(3, "Sam"),
(4,"")
).toDF("ID", "Name")

// null type column

val inputDf = df.withColumn("NulType", lit(null).cast(StringType))

//Output

+---+----+-------+
| ID|Name|NulType|
+---+----+-------+
|  1|    |   null|
|  2| Ram|   null|
|  3| Sam|   null|
|  4|    |   null|
+---+----+-------+

//Replace all blank space in the dataframe with null

val colName = inputDf.columns //*This will give you array of string*

val data = inputDf.na.replace(colName,Map(""->"null"))

data.show()
+---+----+-------+
| ID|Name|NulType|
+---+----+-------+
|  1|null|   null|
|  2| Ram|   null|
|  3| Sam|   null|
|  4|null|   null|
+---+----+-------+