方法一:
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import numpy as npdata = pd.read_csv("src/death.csv", index_col='Unnamed: 0')data = data.dropna(axis=1, thresh=data.shape[0] * 0.2)
data = data.dropna(axis=0, thresh=data.shape[1] * 0.2)a = pd.isna(data).sum()
cols = [x for i, x in enumerate(a.index) if a[i] > 0]mode_list = 'FIPS Admin2'
for i in cols:if mode_list.find(i) != -1:data[i] = data[i].fillna(data[i].mode().iloc[0])else:data[i] = data[i].fillna(data.mean()[i])cols = '2008/10/20,2008/11/20,2008/12/20'.split(',')
x = data[cols]########## Begin ########## out_index = []
for col in x.columns: # 对每一列分别用箱型图进行判断Q1 = x[col].quantile(q=0.25) # 下四分位Q3 = x[col].quantile(q=0.75) # 上四分位low_whisker = Q1 - 1.5 * (Q3 - Q1) # 下边缘up_whisker = Q3 + 1.5 * (Q3 - Q1) # 上边缘# 寻找异常点,获得异常点索引值,删除索引值所在行数据rule = (x[col] > up_whisker) | (x[col] < low_whisker) #得到异常值的下标out = x[col].index[rule]#转化成列表,并入out_index中out_index += out.tolist()#打印该列的异常值数目print("%s %d"%(col,len(out.tolist())))
#删除异常值
x_c1=x.drop(out_index)print("dtype: int64")########## End ##########
x_c1.boxplot()
plt.savefig(r'src/step1/ans_img')
plt.show()
个人觉得其中比较难理解的是这一步
rule = (x[col] > up_whisker) | (x[col] < low_whisker)
rule是一个布尔型Pandas Series,它通过比较数据子集 x
中的每个元素与预先计算的上下界阈值来标识潜在的异常值。
表达式 (x < lower_limit) | (x > upper_limit)
会返回一个新的布尔系列,其中:
- 对于所有小于
lower_limit
的数值,对应位置上的布尔值为True
; - 对于所有大于
upper_limit
的数值,对应位置上的布尔值也为True
; - 其余数值对应的布尔值为
False
。
print("dtype: int64")
这一步单纯是凑答案了,图像没问题,就少了一个这个。
方法二:
来源 http://t.csdnimg.cn/lGnci
Q1 = x.quantile(0.25)
Q3 = x.quantile(0.75)
IQR = Q3 - Q1lower_limit = Q1 - 1.5 * IQR
upper_limit = Q3 + 1.5 * IQRoutliers_index = (x < lower_limit) | (x > upper_limit)# 使用波浪线(~)进行逻辑非操作,选出不在 outliers_index 的行
# 即保留非异常值的行
x_c1 = x[~outliers_index]
print(outliers_index.sum())
outliers_index.sum()
是对布尔型Pandas Series outliers_index
进行求和操作。在布尔类型数据中,True
被视为 1,False
被视为 0。当执行 .sum()
操作时,实际上是计算出 outliers_index
中所有 True
值的数量,即标识为异常值的数据点数量。这段代码的主要目的是统计经过四分位数范围(IQR)方法检测后,在数据子集 x
中识别出的异常值个数。这样输出的结果就直接是答案。