Try any of these:
1) selecting and dropping rows in a cycle:
test_cols = ['N1','N2','N6','N8','N10']
for c in test_cols:
drop_rows = df[(((df[c] - df[c].mean()) / df[c].std()).abs() < 3)].index
df = df.drop(drop_rows)
2) combine drop_rows
indices and drop all of the at once:
drop_set = {}
for c in test_cols:
drop_ind = df[(((df[c] - df[c].mean()) / df[c].std()).abs() < 3)].index
drop_set = {*drop_set, *drop_ind}
df = df.drop(drop_set)
3) have a complex selection condition and drop selected rows at once. Or .
drop_rows = df[(((df['N1'] - df['N1'].mean()) / df['N1'].std()).abs() < 3) |
(((df['N2'] - df['N2'].mean()) / df['N2'].std()).abs() < 3) |
(((df['N6'] - df['N6'].mean()) / df['N6'].std()).abs() < 3) |
(((df['N8'] - df['N8'].mean()) / df['N8'].std()).abs() < 3) |
(((df['N10'] - df['N10'].mean()) / df['N10'].std()).abs() < 3)].index
df = df.drop(drop_rows)
2) and 3) should be faster than 1)