pandas数据框从列的子组中删除异常值

时间:2020-04-13 20:12:36

标签: python pandas data-science outliers

我有一个包含50个数字列和10个分类列的数据框。

df = C1 C2 .. C10 N1 N2 ... N50
     a  b      c   2 3      1

我想删除所有离群值,但仅从列N1,N2,N6,N8,N10中删除。 意思是我不会在所有这些专栏中都保留所有非离群值的问题。 最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

尝试以下任何一种方法

1)在一个循环中选择和删除行:

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)组合drop_rows索引并一次删除所有索引:

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)具有复杂的选择条件,并立即删除选择的行。或者。

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)和3)应该快于1)