当前位置: 首页 > 知识库问答 >
问题:

基于其他列将值映射到特定列

慕俊语
2023-03-14

我有以下问题:

  • 包含带有字符串 AB 或 C 的 col1 的数据
  • 带有整数的第二个 col2
  • 以及其他三列 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。

如何实现此目的?

< code>df.withColumn()我不能使用(或者至少我不知道为什么),对于< code>val df2 = df.map(x =

提前期待您的帮助和感谢!

最好的,肯

共有1个答案

邹宏峻
2023-03-14

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

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|
+----+----+----+----+----+
 类似资料:
  • ...但我得到: 我不知道如何应用这些信息。首先,我认为我需要为列表声明一些额外的映射(在同一个映射器类中),所以MapStruct知道如何像这样映射列表类型的每个字段: ...但我收到错误消息

  • 我正在使用pyspark下面是我的数据

  • 我有下面提到的表,我想通过查询添加列,这将增加一列到表的值对其他列特定值考虑以下表 在这个表中,在1前面想要文本作为活动,在零(0)前面,我想要它作为列名状态的非活动。

  • 问题内容: 我目前有一张看起来像这样的表: 我需要做的是获得“ 费率”列的信息,但每个名称仅获得一次。例如,我有三行John Doe,每行的比率为8。我需要将这些行的比率设为8,而不是24,因此它为每组名称都对比率进行一次计数。 当然是行不通的,因为我试图对比率列而不是名称求和。我知道在对单个记录进行计数时,我可以使用,这就是我试图从中得到的行为类型。 我怎样才能为每个名字获得一个比率? 提前致谢

  • 试图在熊猫中复制一个简单的Excel函数,但没有成功。还没有尝试np.where(),因为我想学习lambda函数,尽可能少依赖导入。 复制的函数: Lambda我测试和工作: 不起作用的熊猫的λ: 错误: 我猜它试图计算整个列,而不是逐行计算,我该如何解决这个问题?

  • 我有一个表(“table1”),有3列,分别称为col1、col2和col3(每个列都是VARCHAR),其中有4个值,如下所示: 我需要能够在任何时候将数据添加到任何列中,而不影响其他列。互联网上非常流行的代码是(比如,我们只需要在col2和col3列中添加数据): 但它添加了新行,如下所示: 我真正需要的是用新值填充列“col1”中以值“datA2”开头的行,并得到如下表: 该表有3列,每列对