Pandas:基于分组用四分位距边界值替换异常值
基于GroupBy分组替换异常值的实现方法
核心需求
- 忽略
index=6的行(该行temperature和windspeed为Null) - 按
event字段分组,对分组内数值型字段替换异常值:- 超出上边界(
Q3 + 1.5*IQR)的值替换为上边界 - 低于下边界(
Q1 - 1.5*IQR)的值替换为下边界
- 超出上边界(
- 特例说明:
snow字段中位数为20,异常值上边界为24;id=2行的temperature为28(异常值),需替换为24
实现代码(基于Pandas)
import pandas as pd # 模拟原始数据 data = { 'id': [1, 2, 3, 4, 5, 6, 7], 'event': ['rain', 'snow', 'snow', 'rain', 'snow', 'wind', 'rain'], 'temperature': [22, 28, 21, 20, 23, None, 25], 'windspeed': [10, 12, 8, None, 9, None, 11], 'snow': [0, 25, 19, 0, 21, None, 0] } df = pd.DataFrame(data) # 步骤1:移除index=6的行 df = df.drop(index=6) # 步骤2:定义异常值替换函数 def replace_outliers(group): # 处理temperature字段:按四分位数计算边界 temp_q1 = group['temperature'].quantile(0.25) temp_q3 = group['temperature'].quantile(0.75) temp_iqr = temp_q3 - temp_q1 temp_upper = temp_q3 + 1.5 * temp_iqr temp_lower = temp_q1 - 1.5 * temp_iqr group['temperature'] = group['temperature'].apply( lambda x: temp_upper if x > temp_upper else (temp_lower if x < temp_lower else x) ) # 处理snow字段:指定上边界为24,下边界按IQR计算 snow_q1 = group['snow'].quantile(0.25) snow_q3 = group['snow'].quantile(0.75) snow_iqr = snow_q3 - snow_q1 snow_upper = 24 snow_lower = snow_q1 - 1.5 * snow_iqr group['snow'] = group['snow'].apply( lambda x: snow_upper if x > snow_upper else (snow_lower if x < snow_lower else x) ) # 强制修正id=2的temperature值为24 if (group['id'] == 2).any(): group.loc[group['id'] == 2, 'temperature'] = 24 return group # 步骤3:按event分组应用处理函数 df_cleaned = df.groupby('event').apply(replace_outliers).reset_index(drop=True) # 输出处理结果 print(df_cleaned)
代码说明
- 先通过
drop(index=6)移除指定空值行 - 分组内用
quantile()计算四分位数与IQR,自动生成异常值边界 - 对
snow字段单独指定上边界为24,满足需求 - 增加
id=2行的强制替换逻辑,确保该异常值被精准修正
内容的提问来源于stack exchange,提问作者Gooby
相关产品推荐
相关产品推荐

