我正在尝试替换“ 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"])
如果您需要其他信息,请告诉我
ValueError:系列的真值不明确。使用空 a.bool(),a.item(),a.any()或a.all()。
答案 0 :(得分:0)
除了使用numpy或for
循环外,您还可以使用带有pandas
的简单赋值进行此替换。作为x
函数中的pandas.Series
的{{1}},您可以将整个最终outlier
循环替换为:
for
就完成了。
请注意,这里我将您的x[x < vmin] = q5
x[x > vmax] = dt
重命名为min
,而您的vmin
重命名为max
。 vmax
和min
是内置的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"])