如何将 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 列应除以 B 和 C
- B 列应除以 A 和 C
- C 列应除以 A 和 B
列名称应为 A_by_B
、A_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|
+------+------------------+------+------------------+------+------+
我试图将数据框中的每一列除以每一列
df = spark.createDataFrame([(1, 2,3), (2, 4,6), (3, 6,9), (4, 8,12), (5, 10,15)], ["A", "B","C"])
所以:
- A 列应除以 B 和 C
- B 列应除以 A 和 C
- C 列应除以 A 和 B
列名称应为 A_by_B
、A_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|
+------+------------------+------+------------------+------+------+