2016-01-14 35 views
8

Bir sütun üzerinde IQR tarafından filtreleme yapmak için yerleşik bir yol var mı (yani, Q1-1.5IQR ve Q3 + 1.5IQR arasındaki değerler)? da, önerilen pandaların diğer olası genelleştirilmiş filtrelerini takdir edeceklerdir.Panda filtresi IQR ile nasıl kullanılır?

cevap

13

Bildiğim kadarıyla, en küçük gösterim, query yöntemiyle getiriliyor gibi görünüyor.

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

Ardından sonucu kontrol etmek için sonucu çizebiliriz. Soldaki kutuda (183'teki haç) aykırı durumun filtrelenmiş serilerde artık görünmediğini görüyoruz. Bu konuyla ilgili bir post yazdım bu cevabı yana

Comparison before and after filterinf

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

Eğer daha fazla bilgi bulabilirsiniz idi.

1

Bu, sütun column arasında DBA yatıyor df altkümesini verir:

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 kullanan diğer bir yaklaşımı():

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

üzerinden çekilmiş:

q1 = df['col'].quantile(.25) 
q2 = df['col'].quantile(.75) 
mask = d['col'].between(q1, q2, inclusive=True) 
iqr = d.loc[mask, 'col']