基于另一列将值映射到特定列

Posted

技术标签:

【中文标题】基于另一列将值映射到特定列【英文标题】:Mapping a value into a specific column based on annother column 【发布时间】:2017-03-01 14:48:39 【问题描述】:

我有以下问题:

一个DataFrame 包含col1 和字符串ABC。 第二个col2Integer。 还有另外三列col3col4col5(这些列也被命名为ABC)。

因此,

 col1 - col2 - A (col3) - B (col4) - C (col5)
|--------------------------------------------
   A      6
   B      5
   C      6

应该得到

 col1 - col2 - A (col3) - B (col4) - C (col5)
|--------------------------------------------
   A      6       6
   B      5                  5
   C      6                              6

现在我想遍历每一行并根据col1 中的条目将col2 中的整数分配给A、B 或C 列。

我如何做到这一点?

df.withColumn() 我不能使用(或者至少我不知道为什么),val df2 = df.map(x => x ) 也是如此。

期待您的帮助,提前致谢!

最好的,肯

【问题讨论】:

【参考方案1】:

在键和目标列之间创建映射:

val mapping = Seq(("A", "col3"), ("B", "col4"), ("C", "col5"))

用它来生成列序列:

import org.apache.spark.sql.functions.when

val exprs = mapping.map  case (key, target) => 
  when($"col1" === key, $"col2").alias(target) 

添加星号并选择:

val df = Seq(("A", 6), ("B", 5), ("C", 6)).toDF("col1", "col2")
df.select($"*" +: exprs: _*)

结果是:

+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
|   A|   6|   6|null|null|
|   B|   5|null|   5|null|
|   C|   6|null|null|   6|
+----+----+----+----+----+

【讨论】:

以上是关于基于另一列将值映射到特定列的主要内容,如果未能解决你的问题,请参考以下文章

基于 MySQL 中的另一列创建计算列

Pandas 根据非恒定值的第三列将值从一列复制到另一列

基于公共列将数据框与另一列中的列连接起来

如何根据 Row_id 列将值写入数据框的另一列并且匹配列中存在值?

基于Scala中另一列的值映射RDD列

基于 Pandas 中另一列文本的特征工程师文本