如何通过使用 pandas 施加限制来处理异常值?

How to handle outliers by imposing limits using pandas?

我有两个数据框,如下所示

df_data = pd.DataFrame({'temp' :[-138,36,34,38,237,339],'heart_rate':[0,0,28,31,25,238]})

df_limit = pd.DataFrame({'reading' :['min_temp','min_heart_rate'],'min_val':[30,24],'max_val':[39,32]})

我已经尝试使用 sdIQR 处理异常值,但它们似乎受到数据分布的影响,仍然给我数据中的异常值。

Q1 = dfx.quantile(0.25)
Q3 = dfx.quantile(0.75)
IQR = Q3 - Q1
print(IQR)

所以,我想做的是对数据施加 minmax 条件。

意思是,如果您查看 df_limit 数据框,您将获得 minmax 特定参数的限制,例如 min_tempmin_heart_rate.

任何违反这些条件的值都必须替换为默认值 min(如果它违反 min 标准)和 max(如果它违反 max标准)值如下所示。请注意我的真实数据有超过百万行和 70 列。任何可扩展的方法都是 helpful.but 是的,我对数据框中的所有这些列都有限制,例如 df_limit

我希望我的输出如下所示。你可以看到 violated values 默认被替换 minmax

使用 DataFrame.clipdf_limit 中提取最小值和最大值:

df_limit = df_limit.set_index('reading')

df_data['temp'] = df_data['temp'].clip(df_limit.loc['min_temp','min_val'],
                                       df_limit.loc['min_temp','max_val'])
df_data['heart_rate'] = df_data['heart_rate'].clip(df_limit.loc['min_heart_rate','min_val'], 
                                                   df_limit.loc['min_heart_rate','max_val'])
print (df_data)
   temp  heart_rate
0    30          24
1    36          24
2    34          28
3    38          31
4    39          25
5    39          32

如果可能创建通用解决方案:

df_limit = df_limit.set_index('reading')

for c in df_data.columns:
    df_data[c] = df_data[c].clip(df_limit.loc[f'min_{c}','min_val'],
                                 df_limit.loc[f'min_{c}','max_val'])

试试这个:

def remove_outlier_by_capping(df1,df2,column):
    upper_lim = df2.loc[column,'max_val']
    lower_lim = df2.loc[column,'min_val']

    df1.loc[(df[column] > upper_lim),column] = upper_lim
    df1.loc[(df[column] < lower_lim),column] = lower_lim
remove_outlier_by_capping(df_data,df_limit,'min_temp')