如何在熊猫中编写离群值的用户定义函数

问题描述 投票:0回答:2

假设我有一个数据框

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)

但是,这表示标记未定义。请帮助我解决此问题。

python pandas outliers
2个回答
1
投票

由于错误提示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

0
投票

您可以通过计算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)

© www.soinside.com 2019 - 2024. All rights reserved.