Подсчет количества:
print(len(data.query('col < 15')) / len(data))
Поиск групп с аномальными значениями и подсчет количества по группе, убираем группы с большим количеством выбросов:
df['too_many'] = data['col_how_many'] < 20
mean_stat = df.pivot_table(index="col1", values="too_many")
good_id = mean_stat.query('too_many < 0.2')
best_data = df.query('col1_id in @good_id.index')
print (len(df))
print (len(best_data))
Теперь только для выбранных групп убираем выбросы по значениям, например от 10 до 500:
best_data = best_data.query('(col_how_many >= 10) & (col_how_many <= 500)')