Нулевые значения PySpark, рассчитанные с использованием медианы, означают возможность обрабатывать столбцы без нумерации c в кадре данных pyspark. - PullRequest
0 голосов
/ 10 января 2020

Я создал следующий код, который работает так, как я хочу, когда все столбцы имеют числовой тип 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 вменяется для всех столбцов одновременно, поэтому я не уверен, как итерировать (или сделать это по-другому), чтобы включить оба?

Спасибо!

1 Ответ

0 голосов
/ 10 января 2020

И 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

...