如何通过对现有列执行一些转换来使用 withcolumn 添加列?

Posted

技术标签:

【中文标题】如何通过对现有列执行一些转换来使用 withcolumn 添加列?【英文标题】:How to add a column using withcolumn by performing some transformation on existing columns? 【发布时间】:2019-08-13 06:27:10 【问题描述】:

我有一个包含列(id:Integer,Name:String,Gender:String) 的简单 csv 文件。我想使用 withColumn 向这个数据框添加一列。我知道第一个参数是列名,但不太确定如何传递将按性别分组的第二个参数。有人可以帮我解决这个问题吗?

我尝试过使用df.withColumn("Count",df.groupby("Gender").count()),但它给出了类型不匹配错误,说它需要一个列类型但得到一个数据框。我尝试过使用col(),也希望它能够输入类型。

val newDf=df.withColumn("count",col(df.groupBy("Gender").count()))

我希望添加一个带有计数列的新数据框。

【问题讨论】:

【参考方案1】:

我想这就是你要找的,window 函数和count 函数的使用

import spark.implicits._

val df = Seq(
  (1, "name1", "M"),
  (2, "name2", "M"),
  (3, "name3", "M"),
  (4, "name4", "M"),
  (5, "name5", "F"),
  (6, "name6", "F"),
  (7, "name7", "M")
).toDF("id", "Name", "Gender")

val window = Window.partitionBy("Gender")

df.withColumn("count", count($"Gender").over(window))
  .show(false)

输出:

+---+-----+------+-----+
|id |Name |Gender|count|
+---+-----+------+-----+
|5  |name5|F     |2    |
|6  |name6|F     |2    |
|1  |name1|M     |5    |
|2  |name2|M     |5    |
|3  |name3|M     |5    |
|4  |name4|M     |5    |
|7  |name7|M     |5    |
+---+-----+------+-----+

【讨论】:

感谢您的帮助,它有效。还有一个额外的问题,有没有办法计算同一个城市的人的性别。假设如果我在那个城市有一个额外的城市列和两个男性和 3 个女性。我如何计算性别城市? 是的,您可以通过在 partitionBy 中传递多个列来实现此目的 如果这有帮助并且有效,您可以接受作为答案吗? 也很好用。非常感谢。我接受它作为答案 我觉得这种方法有问题。如果我有多个具有相同城市名称的条目,它每次都会被打印出来,看起来是多余的。如何让它看起来像一个 sql groupby?

以上是关于如何通过对现有列执行一些转换来使用 withcolumn 添加列?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在SSIS中调用函数或存储过程来使用拆分转换过滤和拆分数据?

我们如何向 aws cdk 中的现有表添加列?

无论如何通过将随机验证码文本转换为图像并在html中显示来使用角度创建验证码

将现有数字单元格转换为文本

保留现有列并将行转换为列[重复]

Python Pandas - 如何在 Excel 工作表的特定列中写入