异常值是指数据中偏离正常范围的极端值,可能是由于测量错误、数据录入错误或其他原因导致的。这些异常值如果不加以处理,可能会影响计算的准确性和分析结果。本节的核心 API 是序列(Series)的 quantile() 函数,用于计算数据的分位数。分位数是将数据按指定百分比划分的值,用于分析数据的分布情况。通过 quantile() 可以计算出 25%、75% 等常用分位数;25% 和 75% 分位数分别称为第一和第三四分位数,记为 Q1、Q3。调用形式为 data.quantile(0.25)、data.quantile(0.75),参数是 0 到 1 之间的比例,不是百分数 25、75。
课程用四分位数范围(IQR)识别异常值:IQR = Q3 - Q1。判定规则:小于 Q1 - 1.5 * IQR 或大于 Q3 + 1.5 * IQR 的观测视为异常值。完整步骤是:先求 Q1、Q3 和 IQR,再算下界 lower_bound = Q1 - 1.5 * IQR、上界 upper_bound = Q3 + 1.5 * IQR,然后用布尔索引 outliers = (data < lower_bound) | (data > upper_bound) 得到与原序列等长的布尔序列,True 表示该位置是异常值。这里用 |(或)连接两个条件,且每个条件都必须加圆括号,这与 4.2.3 多条件联合筛选的写法一致。
【例4-1】编写程序识别序列对象的异常值,并用均值替代异常值。对 data = pd.Series([10, 12, 15, 20, 100, 25, 30, 200]),按上述规则识别后,先计算「不包含异常值」的均值 mean_value = data[~outliers].mean(),再用 data[outliers] = mean_value 写回。对本例,Q1 为 14.25、Q3 为 47.5、IQR 为 33.25,下界约 -35.63、上界约 97.38,故 100 与 200 为异常值;~outliers 取反后只保留 10、12、15、20、25、30,均值约为 18.67,再把该均值赋给异常位置。布尔赋值会直接修改原序列,序列长度不变。
易错点:quantile 参数必须写 0.25/0.75;IQR 是 Q3 减 Q1,上下界必须乘 1.5,不能把「小于 Q1 或大于 Q3」直接当异常值;替换用的均值必须先剔除异常值,否则 100、200 会把均值拉高;| 两侧漏括号会因运算符优先级出错;~ 是对布尔序列按元素取反,不要写成减号。异常值、缺失值、重复值是三类不同问题:本节处理的是偏离正常范围的极端值,不要与 isna()/dropna()/fillna() 或 duplicated()/drop_duplicates() 混用。
quantile() 计算分位数;quantile(0.25)、quantile(0.75) 分别得到第一、第三四分位数 Q1、Q3。IQR = Q3 - Q1。异常值判定:小于 Q1 - 1.5 * IQR 或大于 Q3 + 1.5 * IQR。outliers = (data < lower_bound) | (data > upper_bound),每个条件必须加圆括号。mean_value = data[~outliers].mean(),再 data[outliers] = mean_value(均值不含异常值;布尔赋值直接改原序列)。