Ich habe einen Pandas-Datenrahmen mit wenigen Spalten.
Jetzt weiß ich, dass bestimmte Zeilen Ausreißer sind, die auf einem bestimmten Spaltenwert basieren.
Zum Beispiel
Die Spalte 'Vol' enthält alle Werte
12xx
und ein Wert ist4000
(Ausreißer).
Jetzt möchte ich die Zeilen ausschließen, die eine solche Vol
Spalte haben.
Im Wesentlichen muss ich den Datenrahmen so filtern, dass wir alle Zeilen auswählen, in denen die Werte einer bestimmten Spalte beispielsweise innerhalb von 3 Standardabweichungen vom Mittelwert liegen.
Was ist ein eleganter Weg, um dies zu erreichen?
Verwenden
boolean
Sie die Indizierung wie innumpy.array
Für eine Serie ist es ähnlich:
quelle
DataFrame.abs()
FYIDataFrame.clip()
clip()
Jeff werden die Umrisse nicht entfernt:df.SOME_DATA.clip(-3std,+3std)
Weisen Sie die Umrisse entweder + 3std oder -3std zudf_new = df[np.abs(df - df.mean()) <= (3 * df.std())]
. Im Gegensatz zur Anwendung auf eine Reihe oder eine einzelne Spalte werden dadurch Ausreißer durchnp.nan
den DataFrame ersetzt und die Form beibehalten. Daher ist möglicherweise eine Interpolation erforderlich, um die fehlenden Werte zu füllen.Für jede Ihrer Datenrahmenspalten können Sie ein Quantil erhalten mit:
und dann filtern mit:
Wenn Sie untere und obere Ausreißer entfernen müssen, kombinieren Sie die Bedingung mit einer AND-Anweisung:
quelle
Diese Antwort ähnelt der von @tanemaki, verwendet jedoch einen
lambda
Ausdruck anstelle vonscipy stats
.So filtern Sie den DataFrame, bei dem nur EINE Spalte (z. B. 'B') innerhalb von drei Standardabweichungen liegt:
Hier erfahren Sie, wie Sie diesen Z-Score fortlaufend anwenden können : Rollender Z-Score für Pandas-Datenrahmen
quelle
quelle
Für jede Serie im Datenrahmen können Sie Ausreißer verwenden
between
undquantile
entfernen.quelle
Da ich keine Antwort gesehen habe, die sich mit numerischen und nicht numerischen Attributen befasst, ist hier eine ergänzende Antwort.
Möglicherweise möchten Sie die Ausreißer nur für numerische Attribute löschen (kategoriale Variablen können kaum Ausreißer sein).
Funktionsdefinition
Ich habe @ tanemakis Vorschlag erweitert, Daten zu verarbeiten, wenn auch nicht numerische Attribute vorhanden sind:
Verwendung
Beispiel
Stellen Sie sich einen Datensatz vor
df
mit einigen Werten zu Häusern vor: Gasse, Landkontur, Verkaufspreis, ... ZB: DatendokumentationZunächst möchten Sie die Daten in einem Streudiagramm (mit Z-Score Thresh = 3) visualisieren:
quelle
reduce=False
wurde seitpandas
Version 0.23.0result_type='reduce'
fürreduce=False
.scipy.stats
hat Methodentrim1()
undtrimboth()
die Ausreißer in einer einzigen Zeile auszuschneiden, entsprechend der Rangfolge und einem eingeführten Prozentsatz der entfernten Werte.quelle
trimboth
war für mich am einfachsten.Eine andere Möglichkeit besteht darin, Ihre Daten so zu transformieren, dass die Auswirkungen von Ausreißern gemindert werden. Sie können dies tun, indem Sie Ihre Daten gewinnen.
quelle
Wenn Sie die Methodenverkettung mögen, können Sie Ihre boolesche Bedingung für alle numerischen Spalten wie folgt abrufen:
Jeder Wert jeder Spalte wird
True/False
basierend darauf konvertiert, ob er weniger als drei Standardabweichungen vom Mittelwert entfernt ist oder nicht.quelle
le(3)
seit dem Entfernen von Ausreißern sein. Auf diese Weise erhalten SieTrue
für die Ausreißer. Außerdem sollte +1 und diese Antwort höher seinSie können eine boolesche Maske verwenden:
Ausgabe:
quelle
Da ich mich in einem sehr frühen Stadium meiner datenwissenschaftlichen Reise befinde, behandle ich Ausreißer mit dem folgenden Code.
quelle
Holen Sie sich das 98. und 2. Perzentil als Grenzen unserer Ausreißer
quelle
Es folgt ein vollständiges Beispiel mit Daten und 2 Gruppen:
Importe:
Datenbeispiel mit 2 Gruppen: G1: Gruppe 1. G2: Gruppe 2:
Lesen Sie Textdaten in den Pandas-Datenrahmen:
Definieren Sie die Ausreißer mit Standardabweichungen
Definieren Sie gefilterte Datenwerte und die Ausreißer:
Drucken Sie das Ergebnis:
quelle
Meine Funktion zum Löschen von Ausreißern
quelle
Ich ziehe es vor zu schneiden anstatt zu fallen. Das Folgende wird am 2. und 98. Pecentile befestigt.
quelle
Das Löschen und Löschen von Ausreißern ist meiner Meinung nach statistisch falsch. Dadurch unterscheiden sich die Daten von den Originaldaten. Macht Daten auch ungleich geformt und daher ist der beste Weg, die Auswirkung von Ausreißern durch Protokolltransformation der Daten zu reduzieren oder zu vermeiden. Das hat bei mir funktioniert:
quelle