在分组数据上使用PySpark Imputer

时间:2018-09-09 18:30:06

标签: pyspark missing-data

我有一个Class列,该列可以是1、2或3,另一列Age包含一些丢失的数据。我想估算每个Age组的平均Class

我想做些事情:

grouped_data = df.groupBy('Class')
imputer = Imputer(inputCols=['Age'], outputCols=['imputed_Age'])
imputer.fit(grouped_data)

有什么解决方法吗?

感谢您的时间

2 个答案:

答案 0 :(得分:1)

您需要使用拟合模型来转换数据框。然后取填充数据的平均值:

from pyspark.sql import functions as F

imputer = Imputer(inputCols=['Age'], outputCols=['imputed_Age'])
imp_model = imputer.fit(df)
transformed_df = imp_model.transform(df)
transformed_df \
    .groupBy('Class') \
    .agg(F.avg('Age'))

答案 1 :(得分:1)

使用Imputer,您可以将数据集过滤到每个<div id="wrapper"> <div id="A"> <div id="B"> </div> </div> </div>值,计算均值,然后再将它们重新加入,因为您提前知道了值是什么:

Class

如果您事先不知道这些值是什么,或者它们不容易迭代,则可以对groupBy进行分组,将每个组的平均值作为DataFrame进行获取,然后将其合并回到原始数据中数据框。

subsets = []
for i in range(1, 4):
    imputer = Imputer(inputCols=['Age'], outputCols=['imputed_Age'])
    subset_df = df.filter(col('Class') == i)
    imputed_subset = imputer.fit(subset_df).transform(subset_df)
    subsets.append(imputed_subset)
# Union them together
# If you only have 3 just do it without a loop
imputed_df = subsets[0].unionByName(subsets[1]).unionByName(subsets[2])