如何通过使用 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]})
我已经尝试使用 sd
和 IQR
处理异常值,但它们似乎受到数据分布的影响,仍然给我数据中的异常值。
Q1 = dfx.quantile(0.25)
Q3 = dfx.quantile(0.75)
IQR = Q3 - Q1
print(IQR)
所以,我想做的是对数据施加 min
和 max
条件。
意思是,如果您查看 df_limit
数据框,您将获得 min
和 max
特定参数的限制,例如 min_temp
或 min_heart_rate
.
任何违反这些条件的值都必须替换为默认值 min
(如果它违反 min
标准)和 max
(如果它违反 max
标准)值如下所示。请注意我的真实数据有超过百万行和 70 列。任何可扩展的方法都是 helpful.but 是的,我对数据框中的所有这些列都有限制,例如 df_limit
我希望我的输出如下所示。你可以看到 violated values
默认被替换 min
和 max
值
使用 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'])
试试这个:
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')
我有两个数据框,如下所示
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]})
我已经尝试使用 sd
和 IQR
处理异常值,但它们似乎受到数据分布的影响,仍然给我数据中的异常值。
Q1 = dfx.quantile(0.25)
Q3 = dfx.quantile(0.75)
IQR = Q3 - Q1
print(IQR)
所以,我想做的是对数据施加 min
和 max
条件。
意思是,如果您查看 df_limit
数据框,您将获得 min
和 max
特定参数的限制,例如 min_temp
或 min_heart_rate
.
任何违反这些条件的值都必须替换为默认值 min
(如果它违反 min
标准)和 max
(如果它违反 max
标准)值如下所示。请注意我的真实数据有超过百万行和 70 列。任何可扩展的方法都是 helpful.but 是的,我对数据框中的所有这些列都有限制,例如 df_limit
我希望我的输出如下所示。你可以看到 violated values
默认被替换 min
和 max
值
使用 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'])
试试这个:
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')