【发布时间】:2019-12-05 16:02:51
【问题描述】:
我正在尝试替换“LotFrontage”列的异常值 如果值小于最小值,则将我的 DataFrame 的第 5 个百分位 如果大于最大值,则上限为 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:Series 的真值不明确。使用a.empty, a.bool()、a.item()、a.any() 或 a.all()。
【问题讨论】:
-
您能否尝试将测试数据添加到您的示例中,并显示您如何准确调用函数
outlier? -
我使用 Sdata["LotFrontage"].apply(outlier) 调用函数异常值,如果有帮助请告诉我。测试数据在问题中可用。如果您仍然没有找到,请告诉我。
-
好吧,所以我假设
Sdata是一个数据框,outliner将Series作为输入参数。我认为在您的示例中,如果您执行for i in x其中 x 是Series您迭代值而不是索引。所以i取值:70、70、80 等。pandas.pydata.org/pandas-docs/stable/reference/api/… 如果您提供完整代码,调试它并说更多内容会更容易。 -
@lolnoob 你是对的。这是我唯一想要在函数中使用 For 循环替换列的异常值的代码。但是您已经正确理解了,并且在我的问题中可以看到完整的代码。似乎我的代码没有迭代,
标签: python pandas for-loop replace outliers