Как удалить выброс из строк фрейма данных, имеющих несколько столбцов с похожим именем? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть датафрейм с несколькими столбцами (около 300, здесь я разместил только пять) с похожим именем, и это выглядит примерно так:

   wave          rv           rv           rv           rv          rv                                                                      
4050.32  516.046391  1177.388115   291.478871   667.855218  139.966111   
4512.99  523.027066  1121.650093   304.243851   366.686912   21.157569   
4523.40  653.480487  1258.712111   565.797456   685.889408  211.022502   
4551.65  543.679071  1170.182836   615.175059   538.739229  217.254275   
4554.46  613.018264  1218.368040   512.241826   580.040475  148.860819   
4555.49  660.986074  1310.192328   727.650639   652.957370  241.255968   

Теперь, если я попытаюсь вычислить MAD или MEDIAN каждой строки, чем на нее влияют выбросы.

df['mean_rv']=df.rv.mean(axis=1)
df['mad_rv']=df.rv.mad(axis=1)
df['std_rv']=df.rv.std(axis=1)
df['median_rv']=df.rv.median(axis=1)


wave        mean_rv      mad_rv      std_rv   median_rv                                                                    
4050.32  205.140781  515.455058  675.407100  402.282291   
4512.99  185.022378  527.156411  694.815800  388.641627   
4523.40  305.709437  508.197990  656.888951  565.797456   
4551.65  245.231088  510.966951  663.052403  479.494050   
4554.46  249.040192  546.425471  707.440193  496.937762   
4555.49  354.556840  510.052320  658.062092  586.095377   

Так что, если я хочу удалить выбросы из фрейма данных, то как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Как вы вообще исключаете из любого места - определите порог, обычно в терминах STD, и примените фильтр:

mean = df.rv.mean(axis=1)
std  = df.rv.std(axis=1)
new_mean = df.rv[abs(df.rv.subtract(mean,axis=0)).lt(std,axis=0)].mean(axis=1)

В lt вы можете определить std, 2*stdи т.д., в зависимости от того, что является выбросом.Примечание

df.rv[abs(df.rv.subtract(mean,axis=0)).lt(std,axis=0)]

будет содержать nan значения, в которых находятся ваши выбросы, а mean и аналогичные методы по умолчанию пропускают их.

0 голосов
/ 04 декабря 2018

Вы можете сделать простое обнаружение выброса, используя внутренний квартильный диапазон (IQR).Из википедии

Межквартильный диапазон (IQR), также называемый средним или средним 50%, или технически H-разбросом, является мерой статистической дисперсии, равной разнице между 75-м и 25-м процентилямиили между верхним и нижним квартилями, IQR = Q3 - Q1.Другими словами, IQR - это первый квартиль, вычтенный из третьего квартиля;эти квартили можно отчетливо увидеть на графике на диаграмме.Это мера дисперсии, аналогичная стандартному отклонению или дисперсии, но гораздо более устойчивая к выбросам.

Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
print(IQR)
if(data[i] < (Q1 - 1.5 * IQR)) |(data[i] > (Q3 + 1.5 * IQR))
    #outlier detected 
    #do stuff ...

если точка данных находится за пределами границ выбросов, тогда точка данных, возможно, являетсявыброс.Таким образом, в вашем случае на основе логики вы рассчитываете выбросы для каждого столбца или всех столбцов вместе, это зависит от данных, которые у вас есть, и от того, как они связаны.Надеюсь, поможет.

Кстати, вы можете просто визуализировать вышеуказанный метод, используя matplotlib boxplot.Просто передайте ряд данных, где вы делаете обнаружение выбросов, он напрямую это сделает и подготовит для вас.Существуют и другие методы, такие как scikit learn обнаружение выбросов Этот блог также полезен.

...