Я хочу нормализовать все столбцы DataFrame
. Я использую следующий метод.
from pyspark.sql.functions import stddev_pop, avg, broadcast, mean, stddev
def normalize(df, columns, select_col=[]):
aggMean = []
aggStd = []
for column in columns:
aggMean.append(mean(df[column]).alias(column))
aggStd.append(stddev_pop(df[column]).alias(column))
averages = df.agg(*aggMean).collect()[0]
stds = df.agg(*aggStd).collect()[0]
for column in columns:
df = df.withColumn(column + "_norm", ((df[column] - averages[column]) / stds[column]))
select_col.append(column + "_norm")
df = df.select(select_col)
return df
normalize(train_df,train_df.columns)
Однако он слишком медленный, когда DataFrame
содержит около 10,000
столбцов. Как лучше всего нормализовать такой DataFrame.
Для удобства обсуждения я привожу пример DataFrame
,
df = spark.createDataFrame([(1,2,3,4,5,6,7,8,9,10),(2,3,4,5,6,7,8,9,10,11)],
["a","b","c","d","e","f","g","h","i","j"])