如何用同一数据框中其他列的实际列值替换一列中的字符串值?

Posted

技术标签:

【中文标题】如何用同一数据框中其他列的实际列值替换一列中的字符串值?【英文标题】:How to replace string values in one column with actual column values from other columns in the same dataframe? 【发布时间】:2019-10-03 05:14:03 【问题描述】:

我在一列中有一些字符串值,我想用其他列中的值替换该列中的子字符串,并将所有加号替换为空格(如下所示)。

我有这些 List[String] 映射,它们是动态传递的,mapFrommapTo 应该在索引中关联。

描述值:mapFrom: ["Child Name", "Child Age", "Child State"]

列名:mapTo: ["name", "age", "state"]

输入示例:

name, age, state, description
tiffany, 10, virginia, Child Name + Child Age + Child State
andrew, 11, california, Child State + Child Name + Child Age
tyler, 12, ohio, Child Age + Child State + Child Name

预期结果:

name, age, state, description
tiffany, 10, virginia, tiffany 10 virginia
andrew, 11, california, california andrew 11
tyler, 12, ohio, 12 ohio tyler

如何使用 Spark Scala 实现这一目标?

【问题讨论】:

【参考方案1】:

您想使用regexp_replace 将子字符串替换为另一列中的值。

首先,压缩两个列表(这里我将+到空格的更改添加到两个lsits中,但可以单独完成):

val mapFrom = List("Child Name", "Child Age", "Child State") :+ " \\+ "
val mapTo = List("name", "age", "state").map(col) :+ lit(" ")
val mapToFrom = mapFrom.zip(mapTo)

假设输入数据框df,将所有子字符串替换为其各自的值,如下所示:

val df2 = mapToFrom.foldLeft(df)case (df, (from, to)) => 
  df.withColumn("description", regexp_replace($"description", lit(from), to))

使用提供的输入数据,结果符合预期:

+-------+---+----------+--------------------+
|name   |age|state     |description         |
+-------+---+----------+--------------------+
|tiffany|10 |virginia  |tiffany 10 virginia |
|andrew |11 |california|california andrew 11|
|tyler  |12 |ohio      |12 ohio tyler       |
+-------+---+----------+--------------------+

【讨论】:

有没有办法处理具有相似字符串的字段?例如,from("AGE", "AGENT"), to("age", "agent_name") @Tiffany 我不太确定与上述问题有什么区别。您可以在有更多解释空间的地方创建一个新问题,然后在此处发布链接,以便我查看。 :) 嘿@Shaido,我发布了一个新问题!感谢您的帮助:) ***.com/questions/57359585/… @Tiffany:没问题,我为新问题添加了答案。这似乎是由于使用了“Child”,它是其他描述(ChildAge 和 ChildState)的子序列。

以上是关于如何用同一数据框中其他列的实际列值替换一列中的字符串值?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 NA 替换列中的字符串值并将列转换为浮点数?

如何通过 Pyspark 中同一数据框中另一列的正则表达式值过滤数据框中的一列

Pyspark根据另一列的模式替换列中的字符串

如何用第二列值替换星号

如何将一列的列值组合到 MySQL 中的另一列中?

SQL如何查询出某一列中不同值出现的次数?