Erkennen und Filtern von Ausreißern#

Das Filtern oder Transformieren von Ausreißern ist weitgehend eine Frage der Anwendung von Array-Operationen. Betrachtet einen DataFrame mit einigen normal verteilten Daten:

[1]:
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(1000, 4))

df.describe()
[1]:
0 1 2 3
count 1000.000000 1000.000000 1000.000000 1000.000000
mean -0.022062 -0.045097 0.033339 -0.001697
std 0.999438 1.005070 0.992009 1.000575
min -2.856865 -3.602793 -3.643771 -3.508534
25% -0.716333 -0.650069 -0.628079 -0.653864
50% -0.028872 -0.045310 0.054448 0.019975
75% 0.644004 0.578960 0.732762 0.694976
max 3.254549 2.796084 3.247920 2.989849

Angenommen, ihr wollt in einer der Spalten Werte finden, deren absoluter Wert größer als 3 oder kleiner als -3 ist:

[2]:
col = df[1]

col[col.abs() > 3]
[2]:
714   -3.602793
Name: 1, dtype: float64

Um alle Zeilen auszuwählen, in denen Wert größer 3 oder kleiner -3 in einer der Spalten ist, könnt ihr pandas.DataFrame.any auf einen booleschen DataFrame anwenden, wobei mit any(1) üüberprüft wird, ob ein Wert in einer Zeile war ist:

[3]:
df[(df.abs() > 3).any(1)]
[3]:
0 1 2 3
174 3.128554 2.004932 -1.475202 -0.102378
406 3.254549 0.322807 -0.497333 0.748531
714 0.352575 -3.602793 0.843840 0.118400
784 -0.998979 1.353545 -1.022069 -3.214897
821 -0.046112 -0.080435 -3.643771 0.282301
837 0.527207 0.974202 0.100687 -3.508534
855 0.263539 0.792687 3.247920 0.556589
950 3.084510 -0.923346 -0.149506 -0.983733
965 0.053554 -2.182066 -1.390962 -3.215706

Auf dieser Grundlage können die Werte begrenzt werden auf ein Intervall zwischen -3 und 3. Hierfür verwenden wir die Anweisung np.sign(df), die Werte 1 und -1 erzeugt, je nachdem, ob die Werte in df positiv oder negativ sind:

[4]:
df[df.abs() > 3] = np.sign(df) * 3

df.describe()
[4]:
0 1 2 3
count 1000.000000 1000.000000 1000.000000 1000.000000
mean -0.022530 -0.044494 0.033735 -0.000758
std 0.997978 1.003113 0.989052 0.997577
min -2.856865 -3.000000 -3.000000 -3.000000
25% -0.716333 -0.650069 -0.628079 -0.653864
50% -0.028872 -0.045310 0.054448 0.019975
75% 0.644004 0.578960 0.732762 0.694976
max 3.000000 2.796084 3.000000 2.989849