Заменить значения выбросов - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть датафрейм input_file, где у меня есть столбец days.to.play.Теперь я хочу удалить выброс из этого столбца и заменить его медианным значением.

Я создал список, содержащий значения days.to.play, а затем использовал приведенную ниже функцию для обнаружения и удаления выбросов, но никто не уверен, какзаменить выбросы медианой.

column = input_file['days.to.play']

def reject_outliers(data):
    u = np.mean(data)
    s = np.std(data)
    filtered = [e for e in data if (u - 2 * s < e < u + 2 * s)]
    return filtered

filtered_days = reject_outliers(column name)

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы можете изменить свое понимание списка:

median = np.median(data)
filtered = [e if (u - 2 * s < e < u + 2 * s) else median for e in data]

или обновить напрямую, если данные numpy.array:

median = np.median(data)
data[u - 2 * s < data < u + 2 * s] = median

Здесь только записи, для которых возвращается выражение u - 2 * s < data[i] < u + 2 * sправда обновляются.Смотрите пример обновления всех четных чисел в массиве:

>>> import numpy as np
>>> l = np.array([1,2,3,4,5,6])
>>> l[l % 2 == 0] = -1
>>> l
array([ 1, -1,  3, -1,  5, -1])
0 голосов
/ 19 февраля 2019

Вам не нужно конвертировать его в list.

Использование:

u = np.mean(input_file['days.to.play'])
s = np.std(input_file['days.to.play'])
f1 = u - 2*s
f2 = u + 2*s

input_file['days.to.play'] = np.where(input_file['days.to.play'].between(f1,f2),
                            input_file['days.to.play'], input_file['days.to.play'].median())

Пояснение

np.where занимаетпервый аргумент в качестве условия в вашем случае это значение между f1 и f2, и если оно истинно, то оно сохраняет текущее значение, равное input_file['days.to.play'], в противном случае оно заменяется медианой этого столбца.

См. numpy.where

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...