pandas кадр данных удаляет выбросы из подгруппы столбцов - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть фрейм данных с 50 числовыми столбцами и 10 категориальными столбцами.

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

Я хочу удалить все выбросы, но только из столбцов N1,N2,N6,N8,N10. Это означает, что я не хочу хранить все ошибки, которые не являются выбросами ни в одном из этих столбцов. Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 14 апреля 2020

Попробуйте выполнить одно из следующих действий:

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)

...