我正在尝试编写一个函数来以dataset
范围更新interquartile
中所有列中的所有离群值。当我将一列作为输入传递时它正在工作,但是如果我添加另一个循环以遍历所有列则它不起作用。
df2ColumnNames=df2.columns
def fixoutliers(x):
for i in df2ColumnNames:
print("colnames ",i)
xy=x[i]
print(xy)
updated=[]
Q1,Q3=np.percentile(xy,[25,75])
IQR=Q3-Q1
#print(IQR)
minimum=Q1-1.5*IQR
maximum=Q3+1.5*IQR
print("maximum",maximum)
for i in xy:
if(i>maximum):
i=maximum
updated.append(i)
elif(i<minimum):
i=minimum
updated.append(i)
else:
print("In else")
updated.append(i)
return updated
答案 0 :(得分:1)
感谢您的建议。经过一些努力,我设法创建了我所追求的功能。发布解决方案(如果有帮助的话)
#####定义一个函数,该函数需要输入一个可以 同时包含数字列和分类列######
def fixoutliers(x):
##Get all the column name from the input dataframe x
xColumnNames=x.columns
print(xColumnNames)
#for j in df2ColumnNames:
for j in xColumnNames:
try:
print("colnames ",j)
xy=x[j]
mydata=pd.DataFrame()
#print(xy)
updated=[]
Q1,Q3=np.percentile(xy,[25,75])
IQR=Q3-Q1
minimum=Q1-1.5*IQR
maximum=Q3+1.5*IQR
for i in xy:
if(i>maximum):
print("Entering maxim")
i=maximum
updated.append(i)
elif(i<minimum):
print("enterinf minimum")
i=minimum
updated.append(i)
else:
updated.append(i)
x[j]=updated
except:
continue
return x
答案 1 :(得分:0)
由于箱线图也使用相同的理论“四分位数间距”来检测离群值,因此您可以直接使用它来查找数据帧上的离群值。
import pandas as pd
_, bp = pd.DataFrame.boxplot(df2, return_type='both')
outliers = [flier.get_ydata() for flier in bp["fliers"]]
out_liers = [i.tolist() for i in outliers]