Как написать функции для DataFrame, которая будет заполнять пропуски в столбцах, при этом используя данные других столбцов? Python, pandas
Пытался написать функцию для обработки датасета (для последующего использования в машинном обучении).
В процессе подготовки данных столкнулся с тем, что по некоторым важным параметрам отсутствует большое количество данных (до 57%), эти столбцы конечно можно откинуть, но тогда точность предсказания модели упадет.
Поэтому пропуски лучше заполнить и использовать эти столбцы. Тут возникает следующая проблема: средним значением их заполнять нет смысла, т.к. это опять-таки ухудшит точность (интерполяция тоже не подойдет).
Поэтому решил написать функцию, которая на входе будет принимать список столбцов с пропусками, список вспомогательных столбцов и DataFrame, который необходимо избавить от пропусков в указанных столбцах.
Затем для каждой строки с пропуском функция будет собирать таблицу из отфильтрованных строк начального DataFrame, таким образом, чтоб значения каждой строки по вспомогательным столбцам совпадали со значениями в этих же столбцах в строке с пропуском.
Далее высчитывалось бы среднее значение в отфильтрованной таблице и вставлялось на место пропуска в начальный DataFrame.
Этот способ заполнил бы пропуски таким образом, что сохранилась бы зависимость между столбцами и точность модели не снизилась бы (теоретически).
Вот код функции, который я написал, правда он выдает ошибку, да и я что-то напутал в коде похоже:
def na_filler_num(cols_na_num, cols_help, train_all, train):
for col in cols_na_num:
help_table = train.copy()
help_table = help_table[help_table[col] == help_table[col]] # таблица в которой нет пропусков в нужном столбце
for row in range(0, len(train_all)-1):
help_table_row = help_table.copy() # вспомогательная таблица, в которой будут отфильтровываться все строки с одинаковыми категориями в столбцах из cols_help, таблица обновляется для каждой строки
if train_all[col].iloc()[row] != train_all[col].iloc()[row]: # проверяет-есть ли пропуск в строке по столбцу col
for column in cols_help: # проходит по всем столбцам из cols_help и отбрасывает все строки с другими значениями из этих столбцов
help_table_row = help_table_row[help_table_row[column] == train_all[column].iloc()[row]].copy() # с каждым циклом отфильтровывает таблицу по одному столбцу из cols_help, в итоге после финального цикла,
# в таблице остаются только те строки, которые совпадают по своим категориальным значениям со строкой, в которой есть пропуск.
return help_table_row[col].mean()
else:
return train_all[col].iloc()[row]
Также не совсем понял, как правильно будет использовать эту функцию, использовать ее с .apply()
или лучше чтобы функция вызывалась отдельно и сама меняла DataFrame. Вот ошибка, которую я получил: