Pyspark: функция Concat генерирует столбцы в новый фрейм данных - PullRequest
0 голосов
/ 31 мая 2018

У меня есть pyspark dataframe (df) с n cols, я хотел бы создать еще одну df из n cols, где каждый столбец записывает процентную разницу ч / б последовательных строк в соответствующем оригинальном столбце df.И заголовки столбцов в новом df должны быть == заголовок соответствующего столбца в старом dataframe + "_diff".С помощью следующего кода я могу сгенерировать новые столбцы процентных изменений для каждого столбца в исходном df, но не могу вставить их в новый df с подходящими заголовками столбцов:

from pyspark.sql import SparkSession
from pyspark.sql.window import Window
import pyspark.sql.functions as func

spark = (SparkSession
            .builder
            .appName('pct_change')
            .enableHiveSupport()
            .getOrCreate())

df = spark.createDataFrame([(1, 10, 11, 12), (2, 20, 22, 24), (3, 30, 33, 36)], 
                       ["index", "col1", "col2", "col3"])
w = Window.orderBy("index")

for i in range(1, len(df.columns)):
    col_pctChange = func.log(df[df.columns[i]]) - func.log(func.lag(df[df.columns[i]]).over(w))

Спасибо

1 Ответ

0 голосов
/ 31 мая 2018

В этом случае вы можете сделать понимание списка внутри вызова select.

Чтобы сделать код немного более компактным, мы можем сначала получить столбцы, которые мы хотим отразить в списке:

diff_columns = [c for c in df.columns if c != 'index']

Затем выберите индекс и переберите diff_columns, чтобы вычислить новый столбец.Используйте .alias(), чтобы переименовать получившийся столбец:

df_diff = df.select(
    'index',
    *[(func.log(func.col(c)) - func.log(func.lag(func.col(c)).over(w))).alias(c + "_diff")
      for c in diff_columns]
)
df_diff.show()
#+-----+------------------+-------------------+-------------------+
#|index|         col1_diff|          col2_diff|          col3_diff|
#+-----+------------------+-------------------+-------------------+
#|    1|              null|               null|               null|
#|    2| 0.693147180559945| 0.6931471805599454| 0.6931471805599454|
#|    3|0.4054651081081646|0.40546510810816416|0.40546510810816416|
#+-----+------------------+-------------------+-------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...