PySpark: умножьте 2 таблицы на имена столбцов, суммируйте и добавьте константу

У меня есть два кадра данных, пытающихся умножить несколько столбцов в соответствии с именами столбцов, суммировать общее количество целевых столбцов, а затем добавить константу в качестве окончательных значений. Целью/вариантом использования этого вопроса является применение результата коэффициента регрессии к фрейму данных.

Первый фрейм данных:

ИДЕНТИФИКАТОР А Б С АА 1 2 3 ББ 2 5 4 CC 3 4 1

Второй фрейм данных (целевые столбцы и константа, то есть таблица коэффициентов):

С А Б постоянный 7 8 9 10

Мой ожидаемый результат:

ИДЕНТИФИКАТОР А Б С final_number АА 8 18 21 57 ББ 16 45 28 99 CC 24 36 7 77

Для дальнейшего объяснения расчета final_number: Возьмем в качестве примера идентификатор AA. (1x8)+(2x9)+(3x7)+10 = 57

Так как у меня в двух таблицах более 20 переменных, я стараюсь не использовать один за другим такой код, как df.withColumn("A", 8*F.col("A")). Спасибо за ваш вклад заранее.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
385
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте генераторы списков, чтобы избежать необходимости называть столбцы вручную. Обратите внимание, что НЕ делайте 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|
+---+---+---+---+------------+

Привет @mck, спасибо за ваш вклад. Любопытно знать: (1) Если я хочу использовать только все функции, доступные в df2 (имеется в виду, что в df1 есть некоторые дополнительные функции), как мне лучше изменить код. (2) что там делает *?

Anita 05.01.2021 20:26

@Blair (1) просто измените df1.columns на df2.columns (2) * распаковывает список в отдельные аргументы

mck 05.01.2021 20:42

Другие вопросы по теме