【问题标题】:Interquartile Rules to Replace Outliers in Python在 Python 中替换异常值的四分位数规则
【发布时间】:2021-10-12 08:44:33
【问题描述】:

使用四分位规则替换具有上下边界的异常值时遇到问题,内核返回错误消息“必须指定轴 = 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

寻求帮助,谢谢!

【问题讨论】:

  • 错误信息多行吗?包含它们可能会有所帮助,因为它们通常会确定代码的哪一行是造成问题的原因。也就是说,您的代码中似乎有几个拼写错误,因此您可以输入一些 print() 语句来查看它认为它在做什么。特别是我对 Q3 线持怀疑态度,它可能需要 df[col]。

标签: python dataframe outliers


【解决方案1】:

在通过列的迭代中,您应该始终使用 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)

【讨论】:

  • 非常感谢,非常感谢!
【解决方案2】:

为了帮助调试此代码,在您加载 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

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2020-08-10
    • 2020-11-18
    • 2018-01-05
    • 2020-05-02
    • 2019-10-31
    • 2020-03-21
    • 2013-01-14
    相关资源
    最近更新 更多