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 |