替换 Python 中异常值的四分位数规则

Interquartile Rules to Replace Outliers in Python

我在使用四分位数规则替换具有上下边界的离群值时遇到问题,内核 return 错误提示“必须指定轴 = 0 或 1”

定义四分位规则用上下边界替换异常值的函数代码如下:

def iqr(df):
    for col in df.columns:
        if df[col].dtype != object:
            Q1 = df[col].quantile(0.25)
            Q3 = df.quantile(0.75)
            IQR = Q3 - Q1
            S = 1.5*IQR
            LB = Q1 - S
            UB = Q3 + S
            df[df > UB] = UB
            ddf[df < LB] = LB
        else:
            break
    return df

dataframe是boston,可以从scikit learn加载

from sklearn.datasets import load_boston
df = pd.DataFrame(load_boston().data)
df.columns = boston.feature_names
df

然后,我使用函数将数值属性异常值替换为上限或下限

iqr(df)

但后来发现值错误

ValueError: Must specify axis=0 or 1

寻求帮助,谢谢!

为了帮助调试此代码,在加载 df 后,您可以设置 col,然后 运行 来自 iqr 函数内部的单独代码行。

import pandas as pd

# Make some toy data.  Could also load boston dataset.
df = pd.DataFrame(dict(a=[-10, 100], b=[-100, 25]))
df

# Get the name of the first data column.
col = df.columns[0]
col

# Check if Q1 calculation works.
Q1 = df[col].quantile(0.25)
Q1

...

在遍历列时,您应该始终使用 df[col],而不是 df,因为您只使用一列。因此,例如在您的代码中:

Q3 = df.quantile(0.75)

应该是

Q3 = df[col].quantile(0.75)

df[df > UB] = UB

应该是

df.loc[df > UB,col] = UB

等等……

无需过多更改您的函数,即可运行:

def iqr(df):
    for col in df.columns:
        if df[col].dtype != object:
            Q1 = df[col].quantile(0.25)
            Q3 = df[col].quantile(0.75)
            IQR = Q3 - Q1
            S = 1.5*IQR
            LB = Q1 - S
            UB = Q3 + S
            df.loc[df[col] > UB,col] = UB
            df.loc[df[col] < LB,col] = LB
        else:
            break
    return df

考虑只为一列编写函数,并使用 apply :

def iqr(x):
    IQR = np.diff(x.quantile([0.25,0.75]))[0]
    S = 1.5*IQR
    x[x < Q1 - S] = Q1 - S
    x[x > Q3 + S] = Q1 + S
    return x

df.select_dtypes('number') = df.select_dtypes('number').apply(iqr)