【问题标题】:PySpark null values imputed using median and mean being able to handle non numeric columns in pyspark dataframePySpark 空值使用中位数和均值估算能够处理 pyspark 数据框中的非数字列
【发布时间】:2020-04-28 05:13:24
【问题描述】:

我创建了以下代码,当所有列都是数字数据类型时,它的工作方式就像我想要的那样,它的输入参数是原始数据帧和我想要的数据帧的插补方法,具体取决于我指定的数据帧,它的输出是数据帧估算数据:

def Imputation(df, method):
    if method == 'median':
        imputer =  Imputer(inputCols=df.columns, outputCols=["{}_imputed".format(c) for c in df.columns])
        Median_Imputer = imputer.setStrategy("median").fit(df).transform(df)
        cols = [c for c in Median_Imputer.columns if c.lower()[-7:] == 'imputed']
        Median_Imputer = Median_Imputer[cols]
        return Median_Imputer
    elif method == 'mean':
        imputer = Imputer(inputCols=df.columns, outputCols=["{}_imputed".format(c) for c in df.columns])
        Mean_Imputer = imputer.setStrategy("mean").fit(df).transform(df)
        cols = [c for c in Mean_Imputer.columns if c.lower()[-7:] == 'imputed']
        Mean_Imputer = Mean_Imputer[cols]
        return Mean_Imputer
    else:
        return None

但是,只要我的任何列不是数字,此代码就会失效。对于非数字列,我想为每个空值估算值“缺失”。

我创建的以下代码可以为所有列填充“缺失”的空值:

df.select([(when(isnan(c) | col(c).isNull(), "missing").otherwise(df[c])).alias(c) for c in df.columns]).show()  

但是它对所有数字和字符串类型的列都执行此操作。如何将最后一行代码与我的上述函数合并,以便我可以涵盖这两种情况,使用数字列的中值/平均值进行估算以及为所有字符串列填写“缺失”? imputer 函数似乎同时对所有列进行了估算,所以我不确定如何迭代(或以其他方式进行)以合并两者?

谢谢!

【问题讨论】:

    标签: python pyspark pyspark-sql imputation pyspark-dataframes


    【解决方案1】:

    Imputer 和您的方法都采用所有 DataFrame 的列,但是如果您的 Imputer 输入是数字列,并且您的方法是分类列,那么问题就解决了

    问题归结为您是如何访问数字/分类(字符串类型)列的。

    str_dtype_list = list(filter(lambda tup: tup[1]=='string', df.dtypes))
    str_col_list = [x[0] for x in str_dtype_list]
    

    这为您提供了字符串类型的列名列表,您也可以对 int/double 执行此操作。

    那么当你使用Imputer(input_col=num_col_list)df.select([(when(isnan(c) | col(c).isNull(), "missing").otherwise(df[c])).alias(c) for c in str_col_list]+num_col_list + str_col_list).show()

    这两个代码都将保留所有旧列,加上 Imputed 列

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2023-03-17
      • 2021-12-07
      • 1970-01-01
      • 2020-01-04
      • 2016-10-11
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多