PySpark 空值使用中位数和平均值估算,能够处理 pyspark 数据帧中的非数字列



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

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

但是,每当我的任何列是非数字时,此代码就会崩溃。对于非数字列,我想为每个空值插补值"缺失"。

我创建的以下代码可以为所有列填充带有"missing"的空值:

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

但是,它对所有列数字和字符串类型执行此操作。如何将最后一行代码与上述函数合并,以便我可以涵盖这两种情况,对数字列使用中位数/平均值进行插补,并为所有字符串列填写"缺失"?估算器函数似乎一次对所有列进行插补,所以我不确定如何迭代(或以另一种方式(合并两者?

谢谢!

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

这两个代码都将保留所有旧列,以及插补列

最新更新