У меня есть два кадра данных, пытающихся умножить несколько столбцов в соответствии с именами столбцов, суммировать общее количество целевых столбцов, а затем добавить константу в качестве окончательных значений. Целью/вариантом использования этого вопроса является применение результата коэффициента регрессии к фрейму данных.
Первый фрейм данных:
Второй фрейм данных (целевые столбцы и константа, то есть таблица коэффициентов):
Мой ожидаемый результат:
Для дальнейшего объяснения расчета final_number
: Возьмем в качестве примера идентификатор AA
. (1x8)+(2x9)+(3x7)+10 = 57
Так как у меня в двух таблицах более 20 переменных, я стараюсь не использовать один за другим такой код, как df.withColumn("A", 8*F.col("A"))
. Спасибо за ваш вклад заранее.
Используйте генераторы списков, чтобы избежать необходимости называть столбцы вручную. Обратите внимание, что НЕ делайте from pyspark.sql.functions import *
, потому что я хочу сохранить функцию sum
из Python.
import pyspark.sql.functions as F
output = df1.join(
df2.toDF(*[i+'_2' for i in df2.columns])
).select(
'ID',
*[(F.col(i) * F.col(i + '_2')).alias(i) for i in df1.columns[1:]],
(sum([F.col(i) * F.col(i + '_2') for i in df1.columns[1:]]) + F.col('constant_2')).alias('final_number')
)
output.show()
+---+---+---+---+------------+
| ID| A| B| C|final_number|
+---+---+---+---+------------+
| AA| 8| 18| 21| 57|
| BB| 16| 45| 28| 99|
| CC| 24| 36| 7| 77|
+---+---+---+---+------------+
@Blair (1) просто измените df1.columns
на df2.columns
(2) *
распаковывает список в отдельные аргументы
Привет @mck, спасибо за ваш вклад. Любопытно знать: (1) Если я хочу использовать только все функции, доступные в df2 (имеется в виду, что в df1 есть некоторые дополнительные функции), как мне лучше изменить код. (2) что там делает
*
?