2016-01-14 6 views
8

Есть ли встроенный способ фильтрации по столбцу с помощью IQR (то есть значения между Q1-1.5IQR и Q3 + 1.5IQR)? также будет оценена любая другая возможная обобщенная фильтрация в предложенных пандах.Как использовать фильтр pandas с 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

Это даст вам подмножество df, которая лежит в МКД колонны column:

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'] 
Смежные вопросы