Заменить выбросы на среднее значение в столбцах датафрейма

Есть датафрейм 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])

→ Ссылка