【问题标题】:Adding a index to a dataframe by grouping the data通过分组数据向数据框添加索引
【发布时间】:2021-11-18 07:38:39
【问题描述】:

我在分组数据和添加索引时遇到问题。

一个新的列索引将从 1 开始添加到 n(例如:5)并再次从 1 迭代。 该值可以是任何值,因此基本上在每 n 条记录之后,索引应该以 1 重新开始。

原始数据框

city id
NYC 101
Jersey City 102
Hoboken 103
Buffalo 104
Philly 105
Edison 106

输出数据框应该是这样的

city id index
NYC 101 1
Jersey City 102 2
Hoboken 103 3
Buffalo 104 4
Philly 105 5
Edison 106 1
trenton 107 2

【问题讨论】:

  • 您是否要使用特殊的键/值/列来创建这些组,或者只是将它们批量为等大小的组?
  • @NirHedvat 列“id”是参考列,按升序排列,将行分组为 n(例如:5)

标签: scala apache-spark


【解决方案1】:

试试这个:

data
  .withColumn("groupId", ceil(col("id") / lit(5)))
  .withColumn("index", row_number() over Window.partitionBy("groupId").orderBy("id"))
  .drop(col("groupId"))

输出(测试):

+-----------+---+-----+
|       city| id|index|
+-----------+---+-----+
|        NYC|101|    1|
|Jersey City|102|    2|
|    Hoboken|103|    3|
|    Buffalo|104|    4|
|     Philly|105|    5|
|     Edison|106|    1|
|    Trenton|107|    2|
+-----------+---+-----+

【讨论】:

  • 尼尔,谢谢您的回复。此代码适用于 lit(5) 但如果更改为其他数字则失败。我试过 3 和 7
  • 根据'id'生成的桶。它遍历它们。您将始终有 1 或 2 个组(最多)少于 n 行。这就是余数。除非您想根据不同的列对行进行分组,否则就是解决方案。 Id 是组键(不仅在我的解决方案中,而且在您的问题中)。你能告诉我你想得到什么不同吗?
  • 您想要的是将所有记录分组,然后执行 id 生成。你可以,但我不会推荐它。您将遇到严重的性能问题(尤其是内存)。看看这个:towardsdatascience.com/…。我可以为您提供一种不同的方法,它可以满足您的特定需求,但不适用于大型数据集。
【解决方案2】:

你试过 ntile 吗?它将确保您始终将 id 放置在 5 个桶中,排名从 1 到 5。

WindowSpec window = Window.orderBy(col("id").asc());
dataset.withColumn("index", ntile(5).over(window)).show();

【讨论】:

  • 尼图,感谢您的回复。当应用 ntile 函数时,我看到索引序列重复这样的内容,但输出数据帧应以相同的顺序包含 1 到 5,然后再次以 1 重复 |城市|编号|索引| +-----------+---+-----+ |纽约|101| 1| |泽西城|102| 1| |霍博肯|103| 2| |水牛城|104| 2| |费城|105| 3| |爱迪生|106| 4| |特伦顿|107| 5| +-----------+---+-----+
猜你喜欢
  • 2018-08-24
  • 2018-09-08
  • 2021-12-27
  • 2017-06-10
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多