Gibt es eine eingebaute Möglichkeit, eine Spalte durch IQR zu filtern (d. H. Werte zwischen Q1-1.5IQR und Q3 + 1.5IQR)? auch jede andere mögliche generalisierte Filterung in Pandas vorgeschlagen wird geschätzt.Wie benutze ich Pandas Filter mit IQR?
8
A
Antwort
13
Soweit ich weiß, scheint die kompakteste Notation durch die query
Methode gebracht zu werden.
# Some test data
np.random.seed(33454)
df = (
# A standard distribution
pd.DataFrame({'nb': np.random.randint(0, 100, 20)})
# Adding some outliers
.append(pd.DataFrame({'nb': np.random.randint(100, 200, 2)}))
# Reseting the index
.reset_index(drop=True)
)
# Computing IQR
Q1 = df['nb'].quantile(0.25)
Q3 = df['nb'].quantile(0.75)
IQR = Q3 - Q1
# Filtering Values between Q1-1.5IQR and Q3+1.5IQR
filtered = df.query('(@Q1 - 1.5 * @IQR) <= nb <= (@Q3 + 1.5 * @IQR)')
Dann können wir das Ergebnis plotten, um den Unterschied zu überprüfen. Wir beobachten, dass der Ausreißer im linken Boxplot (das Kreuz bei 183) nicht mehr in der gefilterten Reihe erscheint.
# Ploting the result to check the difference
df.join(filtered, rsuffix='_filtered').boxplot()
Da diese Antwort, die ich ein post zu diesem Thema geschrieben haben, waren Sie weitere Informationen finden können.
1
Dies gibt Ihnen die Teilmenge von df
die column
in der IQR der Säule liegt:
def get_subset_by_IQR(df,column):
q1 = df[column].quantile(0.25)
q3 = df[column].quantile(0.75)
iqr = (df[column] > q1) & (df[column] < q3)
return df.loc[iqr]
2
Einen anderen Ansatz Series.between mit():
iqr = df['col'][df['col'].between(df['col'].quantile(.25), df['col'].quantile(.75), inclusive=True)]
gezogen:
q1 = df['col'].quantile(.25)
q2 = df['col'].quantile(.75)
mask = d['col'].between(q1, q2, inclusive=True)
iqr = d.loc[mask, 'col']