【问题标题】:How to write user defined function in pandas for outliers如何在熊猫中为异常值编写用户定义的函数
【发布时间】:2019-10-30 11:29:22
【问题描述】:

假设我有一个数据框

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在哪里,您在outlier(data, marks)函数调用中使用它。

标签: python pandas outliers


【解决方案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

【讨论】:

    【解决方案2】:

    您可以通过计算 z 分数来做到这一点:

    import pandas as pd
    
    def zscore(x):
        """Calculate Z Score."""
        return (x - x.mean()) / x.std()
    
    def remove_outliers(data: pd.DataFrame, column):
        """Remove outliers."""
        # calculate z-score and set nans to 0
        zscores = zscore(data[column])
        zscores[zscores.isnull()] = 0
        return data.iloc[zscores[(-2 < zscores) & (zscores < 2)].index]
    
    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]
    
    print(remove_outliers(data, "age"))
    

    输出:

      name  age  marks
    0    A   22    422
    1    B    9     59
    3    D   39      3
    4    E   50     50
    5    F   17     47
    6    G   26      2
    7    H   33     83
    8    I  -43     63
    9    J   48     48
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-20
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多