Заменить выбросы на среднее значение в столбцах датафрейма
Есть датафрейм c несколькими столбцами числовых признаков. Нужно в каждом столбце заменить выбросы на среднее значение столбца. Могу написать функцию для замены в одном столбце, например:
def outliers(row):
q_1 = np.quantile(num_cols['col_1'], 0.25)
q_3 = np.quantile(num_cols['col_1'], 0.75)
IQR = q_3 - q_1
if row < (q_1 - IQR * 1.5) or row > (q_3 + IQR * 1.5):
return num_cols['col_1'].mean()
else:
return row
Как правильно написать, чтобы сработало для, например, такого кода:
for col in num_cols[['col_1', 'col_2', 'col_3']]:
num_cols[col] = num_cols.apply(outliers)
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
У вас какая-то путаница между всем фреймом, столбцами, строками, названиями колонок. Надо просто тщательно разобраться. Функция должна получать на вход все аргументы, а не работать с объектами, которые ей вообще не передавались. Должно получиться как-то так:
def outliers(row):
q_1 = np.quantile(row, 0.25)
q_3 = np.quantile(row, 0.75)
IQR = q_3 - q_1
return np.where((row < (q_1 - IQR * 1.5)) | (row > (q_3 + IQR * 1.5)), row.mean(), row)
for col in ['col_1', 'col_2', 'col_3']:
num_cols[col] = outliers(num_cols[col])