gpt4 book ai didi

python - 展开 PySpark DataFrame 的数组列

转载 作者:行者123 更新时间:2023-12-01 00:56:46 34 4
gpt4 key购买 nike

我必须使用下面的数据将 DataFrame 传输到 GraphFrame 中。让我们考虑数据框中的一列作者,其中包含如下所示的字符串数组:

+-----------+------------------------------------+
|ArticlePMID| Authors |
+-----------+------------------------------------+
| PMID1 |['Author 1', 'Author 2', 'Author 3']|
| PMID2 |['Author 4', 'Author 5'] |
+-----------+------------------------------------+

在数据表中,我们有共同合作完成同一篇论文的作者列表。现在我想将第二列扩展为包含以下结构的新数据框:

+---------------+---------------+ 
| Collaborator1 | Collaborator2 |
+---------------+---------------+
| 'Author 1' | 'Author 2' |
| 'Author 1' | 'Author 3' |
| 'Author 2' | 'Author 3' |
| 'Author 4' | 'Author 5' |
+---------------+---------------+

我尝试使用爆炸函数,但这只会将数组扩展为单列作者,并且我失去了协作网络。

有人可以告诉我如何解决这个问题吗?

最佳答案

只要您使用 pyspark 2.1 或更高版本,就可以使用 posexplode随后是加入:

首先用数组中的位置进行爆炸:

from pyspark.sql.functions import posexplode
exploded = df.select("*", posexplode("Authors").alias("pos", "Author"))
exploded.show()
#+-----------+--------------------+---+--------+
#|ArticlePMID| Authors|pos| Author|
#+-----------+--------------------+---+--------+
#| PMID1|[Author 1, Author...| 0|Author 1|
#| PMID1|[Author 1, Author...| 1|Author 2|
#| PMID1|[Author 1, Author...| 2|Author 3|
#| PMID2|[Author 4, Author 5]| 0|Author 4|
#| PMID2|[Author 4, Author 5]| 1|Author 5|
#+-----------+--------------------+---+--------+

现在,在 ArticlePMID 列上将分解的 DataFrame 连接到自身,并仅选择左侧表的 pos 小于右侧表的列。

exploded.alias("l").join(exploded.alias("r"), on="ArticlePMID", how="inner")\
.where("l.pos < r.pos")\
.selectExpr("l.Author AS Collaborator1", "r.Author AS Collaborator2")\
.show()
#+-------------+-------------+
#|Collaborator1|Collaborator2|
#+-------------+-------------+
#| Author 1| Author 2|
#| Author 1| Author 3|
#| Author 2| Author 3|
#| Author 4| Author 5|
#+-------------+-------------+

使用pos进行过滤是为了避免同一对作者同时列出。

关于python - 展开 PySpark DataFrame 的数组列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56185672/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com