Я создал следующий код, который работает так, как я хочу, когда все столбцы имеют числовой тип c, его входные аргументы - это исходный кадр данных и метод вменения, который я хочу для кадра данных, в зависимости от того, что я указываю, и его вывод это фрейм данных с вмененными данными:
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
Однако этот код ломается всякий раз, когда любой из моих столбцов не нумеруется c. Для нечисловых c столбцов я хочу вложить значение «отсутствует» для каждого нулевого значения.
Следующий созданный мной код может заполнить нулевые значения значением «отсутствует» для всех столбцов:
df.select([(when(isnan(c) | col(c).isNull(), "missing").otherwise(df[c])).alias(c) for c in df.columns]).show()
однако он делает это для всех столбцов цифр c и строкового типа. Как я могу включить последнюю строку кода с моей вышеупомянутой функцией, чтобы я мог охватить оба случая, вменяя использование либо медианы / среднего для числовых столбцов c, а также заполняя «пропущенные» для всех строковых столбцов? Кажется, что функция imputer вменяется для всех столбцов одновременно, поэтому я не уверен, как итерировать (или сделать это по-другому), чтобы включить оба?
Спасибо!