如何使用StandardScaler标准化Spark中的一列?

2024-10-01 11:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试标准化(mean=0,std=1)我的数据帧中的一列('age')。以下是我在Spark(Python)中的代码:

from pyspark.ml.feature import StandardScaler
from pyspark.ml.feature import VectorAssembler
from pyspark.ml import Pipeline

# Make my 'age' column an assembler type:
age_assembler = VectorAssembler(inputCols= ['age'], outputCol = "age_feature")

# Create a scaler that takes 'age_feature' as an input column:
scaler = StandardScaler(inputCol="age_feature", outputCol="age_scaled",
                        withStd=True, withMean=True)

# Creating a mini-pipeline for those 2 steps:
age_pipeline = Pipeline(stages=[age_assembler, scaler])
scaled = age_pipeline.fit(sample17)
sample17_scaled = scaled.transform(sample17)
type(sample17_scaled)

看起来很好。最后一行是:“sample17_缩放比例:pyspark.sql.dataframe.dataframe““

但当我运行下面的一行时,它显示新列age_scaled是“vector”类型:|——age_scaled:vector(nullable=true)

sample17_scaled.printSchema()

我如何用这个新列计算任何东西?例如,我不能计算平均数。当我尝试的时候,它说应该是“长”而不是udt。在

非常感谢!在


Tags: fromimportagepipelinecolumnmlfeaturepyspark
1条回答
网友
1楼 · 发布于 2024-10-01 11:28:51

只使用普通聚合:

from pyspark.sql.functions import stddev, mean, col

sample17 = spark.createDataFrame([(1, ), (2, ), (3, )]).toDF("age")

(sample17
  .select(mean("age").alias("mean_age"), stddev("age").alias("stddev_age"))
  .crossJoin(sample17)
  .withColumn("age_scaled" , (col("age") - col("mean_age")) / col("stddev_age")))

# +    +     + -+     +
# |mean_age|stddev_age|age|age_scaled|
# +    +     + -+     +
# |     2.0|       1.0|  1|      -1.0|
# |     2.0|       1.0|  2|       0.0|
# |     2.0|       1.0|  3|       1.0|
# +    +     + -+     +

或者

^{pr2}$

如果你想要Transformer,你可以split vector into columns。在

相关问题 更多 >