假设我有一个数据框
import pandas as pd
data = pd.DataFrame()
data["name"] = ["A","B","C","D","E","F","G","H","I","J"]
data["age"] = [22,9,505,39,50,17,26,33,-43,48]
data["marks"] = [422,59,75,3,50,47,2,83,63,48]
data
现在,我想从数字变量中删除所有异常值。我可以使用1.5 +-IQR公式来实现。
Q1 = data.age.quantile(0.25)
Q3 = data.age.quantile(0.75)
IQR = Q3 - Q1
d=data.loc[~((data.age < (Q1 - 1.5 * IQR)) | (data.age > (Q3 + 1.5 * IQR))),]
d
我想创建一个用户定义的函数,以便我可以放置变量的名称,并且应该自动删除异常值。我试图编写一个用户定义的函数:
def outlier (data,age):
Q1 = data.age.quantile(0.25)
Q3 = data.age.quantile(0.75)
IQR = Q3 - Q1
data.loc[~((data.age < (Q1 - 1.5 * IQR)) | (data.age > (Q3 + 1.5 * IQR))),]
return data
outlier(data,marks)
但是,这表示标记未定义。请帮助我解决此问题。
由于错误提示marks
未在您的代码中定义。您需要将marks
传递为str
例如outlier(data, "marks")
您还需要在函数中进行更改,以使用不同的列
def outlier(data, col):
Q1 = data[col].quantile(0.25)
Q3 = data[col].quantile(0.75)
IQR = Q3 - Q1
data = data.loc[~((data[col] < (Q1 - 1.5 * IQR)) | (data[col] > (Q3 + 1.5 * IQR))),]
return data
您可以通过计算z分数来做到这一点:
def zscore(x):
"""Calculate Z Score."""
return (x - x.mean()) / x.std()
def remove_outliers(sales: pd.DataFrame):
"""Remove outliers."""
# calculate z-score and set nans to 0
zscores = sales.groupby('item_id')['price'].transform(zscore)
zscores[zscores.isnull()] = 0
return sales.iloc[zscores[(-3 < zscores) & (zscores < 3)].index]
然后,data = remove_outliers(data)
。