检测 Pandas 数据框所有列的异常值
Detect Outliers across all columns of Pandas Dataframe
我正在尝试从每个值被标记为离群值的列中提取索引。我想要的是然后组合所有这些索引并将它们从我的数据框中删除。我在这里有一个起点。我不确定我是否应该让函数包含完整的数据集并在其中检测到每一列异常值,或者改为包含在 for 循环中并将错误的索引附加到列表中。
def find_outliers(df):
q1 = df[i].quantile(.25)
q3 = df[i].quantile(.75)
IQR = q3 - q1
ll = q1 - (1.5*IQR)
ul = q3 + (1.5*IQR)
upper_outliers = df[df[i] > ul].index.tolist()
lower_outliers = df[df[i] < ll].index.tolist()
bad_indices = list(set(upper_outliers + lower_outliers))
return(bad_indices)
bad_indexes = []
for col in df.columns:
if df[col].dtype in ["int64","float64"]:
bad_indexes.append(find_outliers(df[col]))
看来我只需要更改 put 中的函数并遍历数据帧的每一列即可完成此操作:
def find_outliers(col):
q1 = col.quantile(.25)
q3 = col.quantile(.75)
IQR = q3 - q1
ll = q1 - (1.5*IQR)
ul = q3 + (1.5*IQR)
upper_outliers = col[col > ul].index.tolist()
lower_outliers = col[col < ll].index.tolist()
bad_indices = list(set(upper_outliers + lower_outliers))
return(bad_indices)
import numpy as np
bad_indexes = []
for col in df.columns:
if df[col].dtype in ["int64","float64"]:
bad_indexes.append(find_outliers(df[col]))
bad_indexes = set(list(np.concatenate(bad_indexes).flat))
print(len(bad_indexes))
这对你有用
def find_outliers(df_in, col_name):
Q1 = df_in[col_name].quantile(0.25)
Q3 = df_in[col_name].quantile(0.75)
IQR = Q3-Q1
fence_low = Q1-1.5*IQR
fence_high = Q3+1.5*IQR
outlier_list=((df_in[col_name] <= fence_low) | (df_in[col_name] >= fence_high)).tolist()
outlier_indexes=[i for i, x in enumerate(outlier_list) if x]
return outlier_indexes
#----------------------
bad_indexes=[]
for col in df.columns:
if df[col].dtype in ["int64", "float64"]:
outlierindexes= find_outliers(df, col)
bad_indexes.extend(outlierindexes)
print(f"All Bad indexes:{bad_indexes}")
我正在尝试从每个值被标记为离群值的列中提取索引。我想要的是然后组合所有这些索引并将它们从我的数据框中删除。我在这里有一个起点。我不确定我是否应该让函数包含完整的数据集并在其中检测到每一列异常值,或者改为包含在 for 循环中并将错误的索引附加到列表中。
def find_outliers(df):
q1 = df[i].quantile(.25)
q3 = df[i].quantile(.75)
IQR = q3 - q1
ll = q1 - (1.5*IQR)
ul = q3 + (1.5*IQR)
upper_outliers = df[df[i] > ul].index.tolist()
lower_outliers = df[df[i] < ll].index.tolist()
bad_indices = list(set(upper_outliers + lower_outliers))
return(bad_indices)
bad_indexes = []
for col in df.columns:
if df[col].dtype in ["int64","float64"]:
bad_indexes.append(find_outliers(df[col]))
看来我只需要更改 put 中的函数并遍历数据帧的每一列即可完成此操作:
def find_outliers(col):
q1 = col.quantile(.25)
q3 = col.quantile(.75)
IQR = q3 - q1
ll = q1 - (1.5*IQR)
ul = q3 + (1.5*IQR)
upper_outliers = col[col > ul].index.tolist()
lower_outliers = col[col < ll].index.tolist()
bad_indices = list(set(upper_outliers + lower_outliers))
return(bad_indices)
import numpy as np
bad_indexes = []
for col in df.columns:
if df[col].dtype in ["int64","float64"]:
bad_indexes.append(find_outliers(df[col]))
bad_indexes = set(list(np.concatenate(bad_indexes).flat))
print(len(bad_indexes))
这对你有用
def find_outliers(df_in, col_name):
Q1 = df_in[col_name].quantile(0.25)
Q3 = df_in[col_name].quantile(0.75)
IQR = Q3-Q1
fence_low = Q1-1.5*IQR
fence_high = Q3+1.5*IQR
outlier_list=((df_in[col_name] <= fence_low) | (df_in[col_name] >= fence_high)).tolist()
outlier_indexes=[i for i, x in enumerate(outlier_list) if x]
return outlier_indexes
#----------------------
bad_indexes=[]
for col in df.columns:
if df[col].dtype in ["int64", "float64"]:
outlierindexes= find_outliers(df, col)
bad_indexes.extend(outlierindexes)
print(f"All Bad indexes:{bad_indexes}")