394 Stimmen

Erkennen und Ausschließen von Ausreißern in einem Pandas DataFrame

Ich habe ein Pandas-Datenrahmen mit wenigen Spalten. Jetzt weiß ich, dass bestimmte Zeilen Ausreißer basierend auf einem bestimmten Spaltenwert sind. Zum Beispiel hat die Spalte Vol alle Werte um 12xx und ein Wert ist 4000 (Ausreißer). Ich möchte diese Zeilen ausschließen, die die Spalte Vol haben.

Also muss ich im Grunde einen Filter auf den Datenrahmen setzen, so dass wir alle Zeilen auswählen, in denen die Werte einer bestimmten Spalte innerhalb, sagen wir, 3 Standardabweichungen vom Mittelwert liegen.

Wie kann man das elegant erreichen?

45voto

user2708149 Punkte 475
#------------------------------------------------------------------------------
# akzeptiere ein DataFrame, entferne Ausreißer, gib bereinigte Daten in einem neuen DataFrame zurück
# siehe http://www.itl.nist.gov/div898/handbook/prc/section1/prc16.htm
#------------------------------------------------------------------------------
def remove_outlier(df_in, col_name):
    q1 = df_in[col_name].quantile(0.25)
    q3 = df_in[col_name].quantile(0.75)
    iqr = q3-q1 #Interquartilbereich
    fence_low  = q1-1.5*iqr
    fence_high = q3+1.5*iqr
    df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]
    return df_out

31voto

KeyMaker00 Punkte 5727

Da ich keine Antwort gesehen habe, die sich mit numerischen und nicht-numerischen Attributen beschäftigt, hier eine ergänzende Antwort.

Sie möchten vielleicht nur Ausreißer bei numerischen Attributen entfernen (kategoriale Variablen können kaum Ausreißer sein).

Funktionsdefinition

Ich habe @tanemakis Vorschlag erweitert, um Daten zu verarbeiten, wenn auch nicht-numerische Attribute vorhanden sind:

from scipy import stats

def drop_numerical_outliers(df, z_thresh=3):
    # Beschränkungen werden `True` oder `False` enthalten, je nachdem, ob es sich um einen Wert unterhalb des Schwellenwerts handelt.
    beschränkungen = df.select_dtypes(include=[np.number]) \
        .apply(lambda x: np.abs(stats.zscore(x)) < z_thresh, reduce=False) \
        .all(axis=1)
    # Werte, die abgelehnt werden sollen, entfernen (direkt)
    df.drop(df.index[~beschränkungen], inplace=True)

Verwendung

drop_numerical_outliers(df)

Beispiel

Stellen Sie sich einen Datensatz df mit einigen Werten über Häuser vor: Gasse, Grundstückskontur, Verkaufspreis, ... Z.B.: Daten Dokumentation

Zuerst möchten Sie die Daten auf einem Scattergraphen visualisieren (mit Z-Score-Schwelle=3):

# Daten vor dem Entfernen der Werte über einem Z-Score von 3 plotten. 
# Die Definition der Funktion scatterAreaVsPrice wurde der Übersichtlichkeit halber entfernt.
scatterAreaVsPrice(df)

Vorher - Fläche gegen Verkaufspreis

# Entfernen Sie die Ausreißer bei allen Attributen
drop_numerical_outliers(train_df)

# Plotten Sie das Ergebnis. Alle Ausreißer wurden entfernt. Beachten Sie, dass die roten Punkte nicht
# dieselben Ausreißer wie im ersten Plot sind, sondern die neuen berechneten Ausreißer basierend auf dem neuen Datenrahmen.
scatterAreaVsPrice(train_df)

Nachher - Fläche gegen Verkaufspreis

21voto

Jeff Hernandez Punkte 1925

Für jede Serie im Datenrahmen könnten Sie between und quantile verwenden, um Ausreißer zu entfernen.

x = pd.Series(np.random.normal(size=200)) # mit Ausreißern
x = x[x.between(x.quantile(.25), x.quantile(.75))] # ohne Ausreißer

15voto

Oleg N. Osychenko Punkte 151

scipy.stats hat die Methoden trim1() und trimboth(), um Ausreißer in einer einzigen Zeile gemäß der Rangfolge und einem eingeführten Prozentsatz entfernter Werte zu entfernen.

10voto

Ted Petrou Punkte 56706

Wenn Sie die Methodenverkettung mögen, können Sie Ihre boolsche Bedingung für alle numerischen Spalten folgendermaßen erhalten:

df.sub(df.mean()).div(df.std()).abs().lt(3)

Jeder Wert jeder Spalte wird basierend darauf, ob er weniger als drei Standardabweichungen vom Mittelwert entfernt ist oder nicht, in True/False konvertiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X