有功能可以消除异常值吗?

时间:2019-07-23 09:53:18

标签: python pandas outliers

我找到了一个从列中检测离群值的函数,但是我不知道如何删除离群值

是否具有从列中排除或消除异常值的功能

这里是检测异常值的功能,但是我需要一个功能来消除异常值

import numpy as np
import pandas as pd
outliers=[]
def detect_outlier(data_1):

    threshold=3
    mean_1 = np.mean(data_1)
    std_1 =np.std(data_1)


    for y in data_1:
        z_score= (y - mean_1)/std_1 
        if np.abs(z_score) > threshold:
            outliers.append(y)
    return outliers

这是打印异常值

#printing the outlier 
outlier_datapoints = detect_outlier(df['Pre_TOTAL_PURCHASE_ADJ'])
print(outlier_datapoints)

4 个答案:

答案 0 :(得分:1)

一个简单的解决方案是使用scipy.stats.zscore

from scipy.stats import zscore
# calculates z-score values
df["zscore"] = zscore(df["Pre_TOTAL_PURCHASE_ADJ"]) 

# creates `is_outlier` column with either True or False values, 
# so that you could filter your dataframe accordingly
df["is_outlier"] = df["zscore"].apply(lambda x: x <= -1.96 or x >= 1.96)

答案 1 :(得分:1)

我假设通过“删除异常值”是指“从df数据框中删除在'Pre_TOTAL_PURCHASE_ADJ'列中包含异常值的行。如果不正确,也许您可​​以修改问题以使意思更清楚。

样本数据也很有帮助,而不是强迫可能的回答者制定自己的答案。

通常,避免对数据帧的行进行迭代会更加高效。对于行选择,所谓的Boolean array indexing是实现目标的一种快速方法。由于您已经有一个 predicate (返回真值的函数)来标识要排除的行,因此可以使用这样的谓词来构建另一个仅包含异常值的数据框,或者(通过否定谓词)仅非异常值。

由于@political_scientist已经给出了使用scipy.stats.zscore在新的is_outlier列中生成谓词值的实用解决方案,因此我将把此答案作为在numpy和pandas中工作的简单通用建议。给定答案,您想要的行将由

给出
df[~df['is_outlier']]

尽管在选择器列的生成中而不是在上面的索引中包含否定符(~)可能会更容易理解,但重命名列'is_not_outlier'

答案 2 :(得分:0)

def outlier():
    import pandas as pd
    df1=pd.read_csv("......\\train.csv")
    _, bp = pd.DataFrame.boxplot(df1, return_type='both')
    outliers = [flier.get_ydata() for flier in bp["fliers"]]
    out_liers = [i.tolist() for i in outliers]

答案 3 :(得分:0)

这里是一维数据集的2种方法。

第1部分:对3个标准偏差使用上限和下限

import numpy as np

# Function to Detection Outlier on one-dimentional datasets.
anomalies = []
def find_anomalies(data):
    # Set upper and lower limit to 3 standard deviation
    data_std = np.std(data)
    data_mean = np.mean(data)
    anomaly_cut_off = data_std * 3

    lower_limit = data_mean - anomaly_cut_off 
    upper_limit = data_mean + anomaly_cut_off

    # Generate outliers
    for outlier in data:
        if outlier > upper_limit or outlier < lower_limit:
            anomalies.append(outlier)
    return anomalies

第2部分:使用IQR(四分位间距)

q1, q3= np.percentile(data,[25,75]) # get percentiles
iqr = q3 - q1 # the IQR value
lower_bound = q1 - (1.5 * iqr) # lower bound
upper_bound = q3 + (1.5 * iqr) # upper bound

np.sum(data > upper_bound) # how many datapoints are above the upper bound?