使用循环替换DataFrame列的多个值(异常值处理)

时间:2019-07-27 18:02:33

标签: python pandas for-loop replace outliers

我正在尝试替换“ LotFrontage”列的异常值 如果值小于最小值,则将DataFrame的值降低百分之五 如果大于max,则上限为95%。我想做这个 仅使用for循环。我试图写这个简单的函数,但这是 不工作。几天来我一直在为此苦苦挣扎, 可以使用numpy解决此问题,但只想使用for循环即可解决。 感谢您的帮助

def outlier(x):
    # taking 5,25,75 percentile of column
    q5= np.percentile(x,5)
    q25=np.percentile(x,25)
    q75=np.percentile(x,75)
    dt=np.percentile(x,95)
    #calculationg IQR range
    IQR=Q3-Q1
    #Calculating minimum threshold
    min=q25-(1.5*IQR)
    max=q75+(1.5*IQR)
    #Calculating maximum threshold
    for i in x:
        if x[i] > max:
            x[i].replace(x[i],dt)
        elif x[i] < min:
            x[i].replace(x[i],q5)
        else:
            x[i]
    print(q5,q25,q75,dt,min,max)

    return

将上述函数应用于DataFrame列

outlier(Sdata["LotFrontage"])

如果您需要其他信息,请告诉我

数据: enter image description here 当我在列上应用此功能时,出现以下错误:

  

ValueError:系列的真值不明确。使用空   a.bool(),a.item(),a.any()或a.all()。

2 个答案:

答案 0 :(得分:0)

除了使用numpy或for循环外,您还可以使用带有pandas的简单赋值进行此替换。作为x函数中的pandas.Series的{​​{1}},您可以将整个最终outlier循环替换为:

for

就完成了。
请注意,这里我将您的x[x < vmin] = q5 x[x > vmax] = dt 重命名为min,而您的vmin重命名为maxvmaxmin是内置的python函数,诸如内置python函数之类的变量命名可能会引起混淆。

但是,由于您询问了max循环,因此如果您真的想使用循环,它应该看起来像这样:

for

因为for i in range(len(x)): if x[i] > vmax: x[i] = dt elif x[i] < vmin: x[i] = q5 必须是索引。

最后,请记住要i。您的通话应如下所示:

return x

答案 1 :(得分:0)

运行Sdata["LotFrontage"].apply(outlier)时,它将实际上使用pd.Series Sdata [“ LotFrontage”]中的每个值调用该函数。您要运行outlier(Sdata["LotFrontage"])

编辑: 另外,您需要将for i in x:替换为for i,value in enumerate(x):

编辑:这是一个可能的解决方案:

def outlier(x):
    # taking 5,25,75 percentile of column
    q5= np.percentile(x,5)
    q25=np.percentile(x,25)
    q75=np.percentile(x,75)
    dt=np.percentile(x,95)
    #calculationg IQR range
    IQR=q75-q25
    #Calculating minimum threshold
    lower_bound=q25-(1.5*IQR)
    upper_bound=q75+(1.5*IQR)
    #Calculating maximum threshold
    print(q5,q25,q75,dt,min,max)
    return x.apply(lambda y: dt if y > upper_bound else y).apply(lambda y: q5 if y < lower_bound else y)

outlier(Sdata["LotFrontage"])