【问题标题】:Replace Values in dataframe conditionally when key appears in a map当键出现在地图中时,有条件地替换数据框中的值
【发布时间】:2017-12-15 02:14:36
【问题描述】:

我在 scala spark 环境中有两个对象。第一个是具有许多字符串类型列的数据框。第二个是一个以 column_names 为键的 Map,每个键的值是另一个定义替换值的 Map。

我想遍历 Map 的 Map,将 column_name 键与数据框键匹配,然后使用替换值的 Map 来替换值。如果替换值映射中不存在该值,那么我想返回该列的原始值。

最好的方法是什么:

val replacements = Map("Col_1" -> Map("Male" -> "0", "Female" -> "1"),
                       "Col_2" -> Map("2" -> "1", "3" -> "1", "4" -> "1")

val df = Seq(("Mary", "Female", "0"), ("John", "Male", "2"), ("Luke", "Male", "1")).toDF(List("name", "Col_1", "Col_2").toSeq:_*)

df.show
+----+------+-----+
|name| Col_1|Col_2|
+----+------+-----+
|Mary|Female|    0|
|John|  Male|    2|
|Luke|  Male|    1|
+----+------+-----+

//I hoped to do something like this:

val fixed_df = replacements.foldLeft(df) { 
case (tmpDF, (colName, foo: Map[key, v])) => tmpDF.withColumn(colName, when($"$colName" isin(foo.keys.to[List]:_*), foo($"$colName")).otherwise($"$colName"))
    }

//to get output like this:
fixed_df.take(3)
+----+------+-----+
|name| Col_1|Col_2|
+----+------+-----+
|Mary|     1|    0|
|John|     0|    1|
|Luke|     0|    1|
+----+------+-----+

请注意,感谢 @tzachz 提供类似但不同的解决方案的帮助。

【问题讨论】:

    标签: scala dictionary apache-spark


    【解决方案1】:

    您只需要na.replace:

    replacements.keys.foldLeft(df)(
      (acc, key) => acc.na.replace(key, replacements(key))
    ).show
    
    // +----+-----+-----+
    // |name|Col_1|Col_2|
    // +----+-----+-----+
    // |Mary|    1|    0|
    // |John|    0|    1|
    // |Luke|    0|    1|
    // +----+-----+-----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2020-03-14
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多