2016-01-14 13 views
8

IQR(つまり、Q1-1.5IQRとQ3 + 1.5IQRの間の値)で列のフィルタリングを行う方法はありますか? また、パンダの他の可能性のある一般化されたフィルタリングが示唆されています。パンダのIQRフィルターの使い方は?

答えて

13

私が知る限り、最もコンパクトな表記法は、queryメソッドによってもたらされるようです。

# 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)') 

次に、結果をプロットして違いを確認することができます。左のボックスプロット(183の十字)の外れ値は、フィルタリングされたシリーズにはもう表示されません。

# Ploting the result to check the difference 
df.join(filtered, rsuffix='_filtered').boxplot() 

Comparison before and after filterinf

私はこのトピックに関するpostを書いたこの答えは、あなたがより多くの情報を見つけることができたので。

1

これはあなたのコラムcolumnのIQRにあるdfのサブセットを提供します:

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

Series.betweenを使用して別のアプローチ():

iqr = df['col'][df['col'].between(df['col'].quantile(.25), df['col'].quantile(.75), inclusive=True)] 

引き出された:

q1 = df['col'].quantile(.25) 
q2 = df['col'].quantile(.75) 
mask = d['col'].between(q1, q2, inclusive=True) 
iqr = d.loc[mask, 'col'] 
関連する問題