如何检测每个列的数据帧中的异常值(例如90%的百分比)



我的数据帧可以简化如下:

数据帧:

df = pd.DataFrame({'Customer_ID': range(1, 9),  'Col 1': [32, 8, 21, 8, 25, 28, 26, 32], 'Col 2': [1, 3, 4, 22, 25, 42, 1, 33],
'Col 3' : [10, 1, 8, 6, 5, 2, 7, 3]})
{'Customer_ID': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8},
'Col 1': {0: 32, 1: 8, 2: 21, 3: 8, 4: 25, 5: 28, 6: 26, 7: 32},
'Col 2': {0: 1, 1: 3, 2: 4, 3: 22, 4: 25, 5: 42, 6: 1, 7: 33},
'Col 3': {0: 10, 1: 1, 2: 8, 3: 6, 4: 5, 5: 2, 6: 7, 7: 3}}

我如何根据每列90%的百分比来检查这个数据集的异常值,并创建这样的结果描述:

df = pd.DataFrame({'Customer_ID': range(1, 9),  'Col 1': [32, 8, 21, 8, 25, 28, 26, 32], 'Col 2': [1, 3, 4, 22, 25, 42, 1, 33],
'Col 3' : [10, 1, 8, 6, 5, 2, 7, 3], 'Description': ['Col 1 & Col 3 = outliers', '-', '-', '-', '-', 'Col 2 = Outlier', '-', 'Col 1 = Outlier']})

期望输出

我知道我可以用以下公式计算每列的第q个分位数:df[['Col 1','Col 2','Col 3' ]].quantile(.90)

您可以使用describe((函数并更改百分比选项。

# Create datafram
data = pd.DataFrame([[1,2,3],[4,5,6], [7,8,9]])
# Defaut value for describe function
data.describe(percentiles=[.25, .5, .75])
data.describe()
# Change percentiles values - Add what you want
data.describe(percentiles=[0.1, .5, 0.9])

在你的数据上以一种非优雅的方式(:D(:

df = pd.DataFrame({'Customer_ID': range(1, 9),  'Col 1': [32, 8, 21, 8, 25, 28, 26, 32], 'Col 2': [1, 3, 4, 22, 25, 42, 1, 33],
'Col 3' : [10, 1, 8, 6, 5, 2, 7, 3]})
df['Outlier_1'] = df['Col 1'].apply(lambda x: ((x >= df['Col 1'].describe([0.9])[5])).sum())
df['Outlier_2'] = df['Col 2'].apply(lambda x: ((x >= df['Col 2'].describe([0.9])[5])).sum())
df['Outlier_3'] = df['Col 3'].apply(lambda x: ((x >= df['Col 3'].describe([0.9])[5])).sum())
df.loc[(df['Outlier_1'] >= 1), 'Outlier_1'] = 'Outlier_1'
df.loc[(df['Outlier_2'] >= 1), 'Outlier_2'] = 'Outlier_2'
df.loc[(df['Outlier_3'] >= 1), 'Outlier_3'] = 'Outlier_3'
df['Outlier'] = df['Outlier_1'] + df['Outlier_2'] +df['Outlier_3']

然后可以删除或保留这些列。您可能可以通过将想法封装到一个函数中并在所需列上循环来简化这一点?

希望能有所帮助。

相关内容

最新更新