【发布时间】:2021-09-07 17:48:49
【问题描述】:
我正在尝试将 standardScaler 用于 sparkML 库,用于具有空值列的数据框。我想保留空值,但是当我使用带有平均值的标准缩放器时,具有空值的列的平均值也变为空。有什么方法可以让标准缩放器跳过空值进行均值计算(如矢量汇编器中的 handleInvalid 选项)?
下面是代码示例
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
sqlContext = SparkSession.builder.appName('test').config("spark.submit.deployMode","client").enableHiveSupport().getOrCreate()
test_df = sqlContext.createDataFrame([(1,2,None),(1,3,3),(1,4,8),(1,5,7),(1,6,8),
(1,7,1),(1,8,6),(1,9,9),(1,10,3),(1,11,12)],schema=['col1','col2','col3'])
#%%
from pyspark.ml.feature import StringIndexer,VectorIndexer,VectorAssembler,StandardScaler
from pyspark.ml import Pipeline,PipelineModel
assmbler = VectorAssembler(inputCols=['col2','col3'],outputCol='col_vec',handleInvalid='keep')
sclr = StandardScaler(withMean=True,inputCol='col_vec',outputCol='col_scaled')
pipeline = Pipeline(stages=[assmbler,sclr])
pipe_fit= pipeline.fit(test_df)
df_res = pipe_fit.transform(test_df)
在此之后,如果我尝试获取平均值。
pipe_fit.stages[1].mean
Out[5]: DenseVector([6.5, nan])
如您所见,第二列的平均值是 nan。有什么办法可以避免这种情况?
【问题讨论】:
标签: pyspark apache-spark-sql apache-spark-ml