【问题标题】:Add different arrays from numpy to each row of dataframe将不同的数组从 numpy 添加到数据帧的每一行
【发布时间】:2019-10-05 04:15:31
【问题描述】:

我有一个 SparkSQL 数据框和 2D numpy 矩阵。它们具有相同的行数。我打算将 numpy 矩阵中的每个不同数组作为新列添加到现有的 PySpark 数据框中。这样每一行添加的列表就不同了。

例如,PySpark 数据框是这样的

| Id     | Name   |
| ------ | ------ |
| 1      | Bob    |
| 2      | Alice  |
| 3      | Mike   |

而numpy矩阵是这样的

[[2, 3, 5]
 [5, 2, 6]
 [1, 4, 7]]

生成的预期数据框应该是这样的

| Id     | Name   | customized_list
| ------ | ------ | ---------------
| 1      | Bob    |   [2, 3, 5]
| 2      | Alice  |   [5, 2, 6]
| 3      | Mike   |   [1, 4, 7]

Id 列对应于 numpy 矩阵中条目的顺序。

我想知道有没有有效的方法来实现这个?

【问题讨论】:

  • Id 列是否与numpy 矩阵中的条目顺序相对应?
  • 是的,会在描述中添加

标签: apache-spark pyspark apache-spark-sql pyspark-sql


【解决方案1】:

从您的numpy 矩阵创建一个DataFrame,并添加一个Id 列来指示行号。然后,您可以在 Id 列上加入原始 PySpark DataFrame。

import numpy as np
a = np.array([[2, 3, 5], [5, 2, 6], [1, 4, 7]])
list_df = spark.createDataFrame(enumerate(a.tolist(), start=1), ["Id", "customized_list"])
list_df.show()
#+---+---------------+
#| Id|customized_list|
#+---+---------------+
#|  1|      [2, 3, 5]|
#|  2|      [5, 2, 6]|
#|  3|      [1, 4, 7]|
#+---+---------------+

这里我使用enumerate(..., start=1)添加行号。

现在只需进行内部连接:

df.join(list_df, on="Id", how="inner").show()
#+---+-----+---------------+
#| Id| Name|customized_list|
#+---+-----+---------------+
#|  1|  Bob|      [2, 3, 5]|
#|  3| Mike|      [1, 4, 7]|
#|  2|Alice|      [5, 2, 6]|
#+---+-----+---------------+

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2013-11-18
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多