首页 > 解决方案 > 如何通过使用熊猫施加限制来处理异常值?

问题描述

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

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)

所以,我想做的是对数据强加minandmax条件。

这意味着,如果您查看df_limit数据框,您将获得特定参数的min和限制,例如or 。maxmin_tempmin_heart_rate

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

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

在此处输入图像描述

标签: pythonpython-3.xpandasdataframeoutliers

解决方案


DataFrame.clip与从 中提取最小值和最大值一起使用df_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'])

推荐阅读