Как удалить выбросы, используя несколько столбцов панд? - PullRequest
0 голосов
/ 02 апреля 2019

Из всего моего фрейма данных у меня есть два столбца цена и количество.Оба содержат выбросы.Как можно удалить выбросы в обоих этих столбцах, чтобы возвращаемый информационный кадр исключал выбросы из обоих этих столбцов?Я могу применить это к одному, но не уверен, как я могу применить это к обоим столбцам.

Я попробовал следующее

def make_mask(df, column):
    standardized = (df[column] - df[column].mean())/df[column].std()
    return standardized.abs() >= 2

def filter_outliers(df, columns):
    print(columns)
    masks = (make_mask(df, column) for column in columns)
    print(masks)
    full_mask = np.logical_or.reduce(masks)
    print(full_mask)
    return df[full_mask]

outliersremoved_df=filter_outliers(df,['price','qty']) 

Я использовал это, но я могу применить его только к одному столбцу за раз:

def remove_outlier(df_in, col_name):
    q1 = df_in[col_name].quantile(0.25)
    q3 = df_in[col_name].quantile(0.75)
    iqr = q3-q1 #Interquartile range
    fence_low  = q1-1.5*iqr
    fence_high = q3+1.5*iqr
    df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]
    return df_out

ошибка с2 верхние функции:

ValueError: too many values to unpack (expected 1)

1 Ответ

0 голосов
/ 02 апреля 2019

Пожалуйста, используйте нижеприведенную функцию, которая применяется ко всем столбцам, которые у вас есть в # df

def cap_data(df):
    for col in df.columns:
        print("capping the ",col)
        if (((df[col].dtype)=='float64') | ((df[col].dtype)=='int64')):
            percentiles = df[col].quantile([0.01,0.99]).values
            df[col][df[col] <= percentiles[0]] = percentiles[0]
            df[col][df[col] >= percentiles[1]] = percentiles[1]
        else:
            df[col]=df[col]
    return df

final_df=cap_data(df)
...