如何在 Pyspark Dataframe 中创建多列的所有成对组合?

Posted

技术标签:

【中文标题】如何在 Pyspark Dataframe 中创建多列的所有成对组合?【英文标题】:How can I create all pairwise combinations of multiple columns in a Pyspark Dataframe? 【发布时间】:2021-06-03 15:54:25 【问题描述】:

考虑以下 Pyspark 数据框

Col1 Col2 Col3
A D G
B E H
C F I

如何创建以下包含所有列的所有成对组合的数据框?

Col1 Col2 Col3 Col1_Col2_cross Col1_Col3_cross Col2_Col3_cross
A D G A,D A,G D,G
B E H B,E B,H E,H
C F I C,F C,I F,I

【问题讨论】:

它是否需要适用于任意数量的列,还是只适用于 3 个? 任意数量的列。我实际上有大约 30 列,但这里只显示了 3 列以简化问题。 【参考方案1】:

您可以使用itertools生成列组合:

import pyspark.sql.functions as F
import itertools

df2 = df.select(
    '*', 
    *[F.concat_ws(',', x[0], x[1]).alias(x[0] + '_' + x[1] + '_cross') 
      for x in itertools.combinations(df.columns, 2)]
)

df2.show()
+----+----+----+---------------+---------------+---------------+
|Col1|Col2|Col3|Col1_Col2_cross|Col1_Col3_cross|Col2_Col3_cross|
+----+----+----+---------------+---------------+---------------+
|   A|   D|   G|            A,D|            A,G|            D,G|
|   B|   E|   H|            B,E|            B,H|            E,H|
|   C|   F|   I|            C,F|            C,I|            F,I|
+----+----+----+---------------+---------------+---------------+

【讨论】:

以上是关于如何在 Pyspark Dataframe 中创建多列的所有成对组合?的主要内容,如果未能解决你的问题,请参考以下文章

在 PySpark 的两个不同 pyspark.sql.dataframes 中的两列中创建一个 pyspark.sql.dataframe

如何在保留现有架构的同时从行中创建 DataFrame?

Pyspark:如何在不同条件的数据框中创建列

使用带有 Spark 版本 2.2 的 row_number() 函数在 PySpark DataFrame 中创建每一行的行号

具有聚合唯一值的pyspark dataframe groupby [重复]

PySpark 1.5 Groupby Sum 用于 Dataframe 中的新列