首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用两个变量列表添加scala列

使用两个变量列表添加scala列
EN

Stack Overflow用户
提问于 2019-06-19 06:22:57
回答 1查看 527关注 0票数 1

我有两个Seqs,我想用它们将列添加到dataframe中。

序列号是这样的:Seq("red", "blue", "green", "yellow", "violet")

Sequo2类似于:Seq("child", "teen", "adult", "senior")

我还有一个列,它是一个字符串,其格式为: s"$color+$age- score =$score",包含颜色和年龄的每种组合,以及结果分数,因此20个不同的颜色年龄分数。

目前,我正在做类似这样的事情

代码语言:javascript
复制
finalDF.withColumn("red_child", getScore("red", "child"))
.withColumn("red_teen", getScore("red", "teen"))
.withColumn("red_adult", getScore("red", "adult"))

以此类推,对于所有20种可能的组合,getScore是一个处理正则表达式的辅助函数。

因为我使用了20次withColumn,所以代码很难读懂。我想知道是否有任何方法可以让这段代码看起来更干净,使用颜色和年龄的两个Seqs循环并将列添加到dataframe中。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-19 09:04:41

您可以简单地select从使用for-comprehension生成的元组列表派生的其他列,如下所示:

代码语言:javascript
复制
val colors = Seq("red", "blue", "green", "yellow", "violet")
val ageGroups = Seq("child", "teen", "adult", "senior")

val colPairs = for { c <- colors; a <- ageGroups } yield (c, a)

def getScore(c: String, a: String): Column = ???

df.select( df.columns.map(col) ++ colPairs.map{ case (c, a) =>
    getScore(c, a).as(c + "_" + a)
  }: _*
)

或者,使用foldLeft遍历colPairs列表以通过withColumn添加列

代码语言:javascript
复制
colPairs.foldLeft(df){ case (accDF, (c, a)) =>
  accDF.withColumn(c + "_" + a, getScore(c, a))
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56657794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档