Pyspark 对分组数据使用Pypark插补器

Pyspark 对分组数据使用Pypark插补器,pyspark,missing-data,Pyspark,Missing Data,我有一个Class列,可以是1、2或3,还有一个Age列,其中有一些缺少的数据。我想估算每个类组的平均年龄 我想做点什么: grouped_data = df.groupBy('Class') imputer = Imputer(inputCols=['Age'], outputCols=['imputed_Age']) imputer.fit(grouped_data) 有什么解决办法吗 感谢您抽出时间您需要使用合适的型号转换数据帧。然后取填充数据的平均值: from pyspark.sql

我有一个
Class
列,可以是1、2或3,还有一个
Age
列,其中有一些缺少的数据。我想估算每个
组的平均
年龄

我想做点什么:

grouped_data = df.groupBy('Class')
imputer = Imputer(inputCols=['Age'], outputCols=['imputed_Age'])
imputer.fit(grouped_data)
有什么解决办法吗


感谢您抽出时间

您需要使用合适的型号转换数据帧。然后取填充数据的平均值:

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'))

使用Imputer,您可以将数据集向下过滤到每个
值,输入平均值,然后将它们合并回来,因为您提前知道值可以是什么:

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])
如果您事先不知道这些值是什么,或者如果它们不容易计算,您可以分组,将每个组的平均值作为一个数据帧,然后合并到原始数据帧上

import pyspark.sql.functions as F
averages = df.groupBy("Class").agg(F.avg("Age").alias("avgAge"))
df_with_avgs = df.join(averages, on="Class")
imputed_df = df_with_avgs.withColumn("imputedAge", F.coalesce("Age", "avgAge"))

谢谢你的回答。顺便说一句,那不是我想要的。我需要的是在类==1时,在类==1时,在缺少的年龄值中,在类==2时,在缺少的年龄值中,在类==3时,在类==1时,在类==2时,在缺少的年龄值中,在类==1时,计算年龄值的平均值,在类==3时,计算相同的值。