2016-01-14 24 views
8

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?

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() 

Comparison before and after filterinf

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']