Конвертировать в NaN, если ячейка сверху или снизу x% - PullRequest
1 голос
/ 16 октября 2019

Я собираюсь урезать мой фрейм данных, удалив верхние и нижние 5% или около того данных из определенных столбцов. Есть ошибочные выбросы, которые мешают мне эффективно использовать данные.

В фрейме данных есть столбец «name» и несколько других нечисловых столбцов, поэтому я хочу иметь возможность выбрать конкретные столбцы для обрезки df.

Я думаю, что преобразование ячейки в NaN, если ее значение равно наибольшему или наименьшему x%, будет эффективным способом сделать это, но я открыт для других способов, если они тоже работают.

Вот пример того, что я пытаюсь сделать:

for column in df.columns:
    top = column.quantile(0.95)
    bottom = column.quantile(0.05)
    for cell in column:
        if (cell >= top)|(cell <= bottom):
            cell = np.NaN

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Вы можете использовать метод np.argpartation , как показано ниже, чтобы выбрать верхний и нижний 5% -ые данные из каждого столбца. Это будет более эффективно, так как использует векторизацию, а также не нужно сортировать все строки

bottom_ind = np.argpartition(df.values, trim_len, axis=0)[:trim_len]
top_ind = np.argpartition(df.values, -trim_len, axis=0)[-trim_len:]
trim_ind = np.r_[bottom_ind, top_ind]

## you can use loop here if you have more columns
df.iloc[trim_ind[0],0] = np.nan
df.iloc[trim_ind[1],1] = np.nan
df
0 голосов
/ 16 октября 2019

Я думаю, что вы хотите between. Также вы можете передать массив в quantile():

for column in [your_list_of_columns]:
    bottom, top = df[column].quantile([0.05,0.95])

    df[column] = df[column].where(df[column].between(bottom, top))
...