我找到了一个从列中检测离群值的函数,但是我不知道如何删除离群值
是否具有从列中排除或消除异常值的功能
这里是检测异常值的功能,但是我需要一个功能来消除异常值
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)
答案 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种方法。
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
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?