如何将 df 中的每一列除以 pyspark 中的其他列?

how to divide each column in a df by other columns in pyspark?

我试图将数据框中的每一列除以每一列

df = spark.createDataFrame([(1, 2,3), (2, 4,6), (3, 6,9), (4, 8,12), (5, 10,15)], ["A", "B","C"])  

所以:

列名称应为 A_by_BA_by_C

我可以通过以下方式在 python 中执行此操作,但不确定这在 pyspark 中如何工作

df_new = pd.concat([df[df.columns.difference([col])].div(df[col], axis=0)\
.add_suffix(f'_by_{col}') for col in df.columns], axis=1)
df = spark.createDataFrame([(1, 2, 3), (2, 4, 6), (3, 6, 9)], ('A', 'B', 'C'))
df_1 = df.withColumn('A by B', df.A/df.B)
df_2 = df_1.withColumn('A by c', df.A/df.C)
df_3 = df_2.withColumn('B by A', df.B/df.A)
df_4 = df_3.withColumn('B by C', df.B/df.C)
df_4.show()

您可以循环遍历 DataFrame 列来创建新列 X_by_Y,如下所示:

df = spark.createDataFrame([(1, 2,3), (2, 4,6), (3, 6,9), (4, 8,12), (5, 10,15)], ["A", "B","C"])

select_expr = list()
for c in df.columns:
    for denominator in df.columns:
        if c != denominator:
            select_expr.append((col(c)/col(denominator)).alias(f'{c}_by_{denominator}'))

df.select(*select_expr).show()

+------+------------------+------+------------------+------+------+
|A_by_B|            A_by_C|B_by_A|            B_by_C|C_by_A|C_by_B|
+------+------------------+------+------------------+------+------+
|   0.5|0.3333333333333333|   2.0|0.6666666666666666|   3.0|   1.5|
|   0.5|0.3333333333333333|   2.0|0.6666666666666666|   3.0|   1.5|
|   0.5|0.3333333333333333|   2.0|0.6666666666666666|   3.0|   1.5|
|   0.5|0.3333333333333333|   2.0|0.6666666666666666|   3.0|   1.5|
|   0.5|0.3333333333333333|   2.0|0.6666666666666666|   3.0|   1.5|
+------+------------------+------+------------------+------+------+