Mam ramkę danych pand z kilkoma kolumnami.
Teraz wiem, że niektóre wiersze są wartościami odstającymi na podstawie określonej wartości kolumny.
Na przykład
kolumna „Vol” ma wszystkie wartości wokół,
12xx
a jedna wartość to4000
(odstająca).
Teraz chciałbym wykluczyć te wiersze, które mają Vol
taką kolumnę.
Zasadniczo więc muszę umieścić filtr w ramce danych, abyśmy wybrali wszystkie wiersze, w których wartości określonej kolumny mieszczą się w, powiedzmy, 3 standardowych odchyleniach od średniej.
Jaki jest elegancki sposób na osiągnięcie tego?
Używaj
boolean
indeksowania tak, jak robisz to wnumpy.array
W przypadku serii jest to podobne:
źródło
DataFrame.abs()
FYI równieżDataFrame.clip()
clip()
Jeffa kontury nie są usuwane:df.SOME_DATA.clip(-3std,+3std)
przypisz kontury do + 3std lub -3stddf_new = df[np.abs(df - df.mean()) <= (3 * df.std())]
. Ale w przeciwieństwie do zastosowania go do Serii lub pojedynczej kolumny, spowoduje to zastąpienie wartości odstającychnp.nan
i zachowanie kształtu DataFrame, więc może być konieczna interpolacja w celu uzupełnienia brakujących wartości.Dla każdej kolumny ramki danych można uzyskać kwantyl za pomocą:
a następnie filtruj za pomocą:
Jeśli trzeba usunąć dolne i górne wartości odstające, połącz warunek z instrukcją AND:
źródło
Ta odpowiedź jest podobna do tej dostarczonej przez @tanemaki, ale używa
lambda
wyrażenia zamiastscipy stats
.Aby przefiltrować ramkę danych, gdy tylko JEDNA kolumna (np. „B”) mieści się w trzech standardowych odchyleniach:
Zobacz tutaj, jak stosować ten wynik Z na bieżąco: Toczący wynik Z zastosowany do ramki danych pand
źródło
źródło
Ponieważ nie widziałem odpowiedzi dotyczącej liczbowych i nienumerycznych atrybutów, oto odpowiedź uzupełniająca.
Możesz zrzucić wartości odstające tylko na atrybuty liczbowe (zmienne kategorialne nie mogą być wartościami odstającymi).
Definicja funkcji
Rozszerzyłem sugestię @ tanemaki do obsługi danych, gdy obecne są również atrybuty nienumeryczne:
Stosowanie
Przykład
Wyobraź sobie zbiór danych
df
z pewnymi wartościami dotyczącymi domów: aleja, kontur terenu, cena sprzedaży, ... Np .: Dokumentacja danychNajpierw chcesz wizualizować dane na wykresie punktowym (z Z-score Thresh = 3):
źródło
reduce=False
został uznany za przestarzały odpandas
wersji 0.23.0result_type='reduce'
dlareduce=False
.Dla każdej serii w ramce danych można użyć
between
iquantile
usunąć wartości odstające.źródło
scipy.stats
ma metodytrim1()
itrimboth()
wycinać wartości odstające w jednym rzędzie, zgodnie z rankingiem i wprowadzonym procentem usuniętych wartości.źródło
trimboth
było dla mnie najłatwiejsze.Inną opcją jest przekształcenie danych, aby złagodzić wpływ wartości odstających. Możesz to zrobić, wygrywając swoje dane.
źródło
Jeśli podoba Ci się łączenie metod, możesz uzyskać warunek logiczny dla wszystkich kolumn numerycznych, takich jak:
Każda wartość każdej kolumny zostanie przekonwertowana na
True/False
podstawie tego, czy jest ona mniejsza niż trzy standardowe odchylenia od średniej, czy nie.źródło
le(3)
od momentu usunięcia wartości odstających. W ten sposób dostajeszTrue
wartości odstające. Poza tym +1 i ta odpowiedź powinna być wyższaMożesz użyć maski logicznej:
wynik:
źródło
Ponieważ jestem na bardzo wczesnym etapie mojej podróży do nauki danych, odbiegam od poniższego kodu.
źródło
Zdobądź 98. i 2. percentyl jako granice naszych wartości odstających
źródło
pełny przykład z danymi i 2 grupami:
Import:
Przykład danych z 2 grupami: G1: Grupa 1. G2: Grupa 2:
Odczytaj dane tekstowe do ramki danych pand:
Zdefiniuj wartości odstające za pomocą standardowych odchyleń
Zdefiniuj wartości filtrowanych danych i wartości odstające:
Wydrukuj wynik:
źródło
Moja funkcja usuwania wartości odstających
źródło
Wolę przycinać niż upuszczać. poniższe zostaną przypięte na drugim i 98 pecentylu.
źródło
Usuwanie i pomijanie wartości odstających uważam za statystycznie złe. To odróżnia dane od danych oryginalnych. Sprawia również, że dane są nierównomiernie ukształtowane, a zatem najlepszym sposobem jest zmniejszenie lub uniknięcie efektu wartości odstających przez logiczną transformację danych. To działało dla mnie:
źródło