Это можно сделать за 2 заявки. В этом решении выбросы обнаруживаются отдельно для каждого столбца, а их строки, содержащие выброс для любого столбца, удаляются индивидуально.
Предположим, что этот набор данных. Я изменил вашу функцию и установил значения q1 и q3 на те, которые должны быть. для каждого столбца.
outliers = df.apply(get_outliers)
A B C D
0 False False False False
1 False False False False
2 False True False False
3 False False True False
4 False False False False
Второй шаг - найти строки, в которых любое из значений истинно, и отбросить их.
df[~outliers.apply(lambda x:any(x), axis=1)]
A B C D
0 1 100 2 3
1 1 200 4 5
4 2 200 3 1