首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从现有的Dataframe创建,以便基于现有的Dataframe行创建新的Dataframe列

从现有的Dataframe创建,以便基于现有的Dataframe行创建新的Dataframe列
EN

Stack Overflow用户
提问于 2017-08-30 02:29:54
回答 1查看 2.2K关注 0票数 0

我现有的数据格式如下:

代码语言:javascript
复制
Timestamp,         ID,   Value
29/08/2017 4:51:23, ID-1, 1.1
29/08/2017 4:52:14, ID-2, 2.1
29/08/2017 4:52:14, ID-3, 3.1
29/08/2017 4:55:23, ID-1, 1.2
29/08/2017 4:55:23, ID-3, 3.2
29/08/2017 4:57:42, ID-2, 2.2

我想从现有的dataframe中创建一个dataframe,这样“ID”将成为列名,“Values”将成为各列的数据,如下所示:

代码语言:javascript
复制
Timestamp,            ID-1,    ID-2,   ID-3
29/08/2017 4:51:23,    1.1,     null,   null
29/08/2017 4:52:14,    null,    2.1,    3.1
29/08/2017 4:55:23,    1.2,     null,   3.2
29/08/2017 4:57:42,    null,    2.2,    null

我无法在Scala中找到可行的解决方案。我们很感激你的帮助。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-30 03:36:35

您可以简单地将groupBy()piviot()一起使用。使用您的示例dataframe:

代码语言:javascript
复制
val spark = SparkSession.builder.getOrCreate()
import spark.implicits._

val df = ...

df.show()
+------------------+----+-----+
|         Timestamp|  ID|Value|
+------------------+----+-----+
|29/08/2017 4:51:23|ID-1|  1.1|
|29/08/2017 4:52:14|ID-2|  2.1|
|29/08/2017 4:52:14|ID-3|  3.1|
|29/08/2017 4:55:23|ID-1|  1.2|
|29/08/2017 4:55:23|ID-3|  3.2|
|29/08/2017 4:57:42|ID-2|  2.2|
+------------------+----+-----+

val newDF = df.groupBy("Timestamp")
  .pivot("ID")
  .agg(sum($"Value"))

newDF.show()
+------------------+----+----+----+
|         Timestamp|ID-1|ID-2|ID-3|
+------------------+----+----+----+
|29/08/2017 4:57:42|null| 2.2|null|
|29/08/2017 4:55:23| 1.2|null| 3.2|
|29/08/2017 4:51:23| 1.1|null|null|
|29/08/2017 4:52:14|null| 2.1| 3.1|
+------------------+----+----+----+

如果两行或多行的时间戳和id相同,则这些值将一起添加。如果您想要另一种行为,只需更改agg()方法。平均值是agg(avg($"Value"))

希望能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45950979

复制
相关文章

相似问题

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