替换 Python 中异常值的四分位数规则
Interquartile Rules to Replace Outliers in Python
我在使用四分位数规则替换具有上下边界的离群值时遇到问题,内核 return 错误提示“必须指定轴 = 0 或 1”
定义四分位规则用上下边界替换异常值的函数代码如下:
def iqr(df):
for col in df.columns:
if df[col].dtype != object:
Q1 = df[col].quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
S = 1.5*IQR
LB = Q1 - S
UB = Q3 + S
df[df > UB] = UB
ddf[df < LB] = LB
else:
break
return df
dataframe是boston,可以从scikit learn加载
from sklearn.datasets import load_boston
df = pd.DataFrame(load_boston().data)
df.columns = boston.feature_names
df
然后,我使用函数将数值属性异常值替换为上限或下限
iqr(df)
但后来发现值错误
ValueError: Must specify axis=0 or 1
寻求帮助,谢谢!
为了帮助调试此代码,在加载 df
后,您可以设置 col
,然后 运行 来自 iqr
函数内部的单独代码行。
import pandas as pd
# Make some toy data. Could also load boston dataset.
df = pd.DataFrame(dict(a=[-10, 100], b=[-100, 25]))
df
# Get the name of the first data column.
col = df.columns[0]
col
# Check if Q1 calculation works.
Q1 = df[col].quantile(0.25)
Q1
...
在遍历列时,您应该始终使用 df[col],而不是 df,因为您只使用一列。因此,例如在您的代码中:
Q3 = df.quantile(0.75)
应该是
Q3 = df[col].quantile(0.75)
和
df[df > UB] = UB
应该是
df.loc[df > UB,col] = UB
等等……
无需过多更改您的函数,即可运行:
def iqr(df):
for col in df.columns:
if df[col].dtype != object:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
S = 1.5*IQR
LB = Q1 - S
UB = Q3 + S
df.loc[df[col] > UB,col] = UB
df.loc[df[col] < LB,col] = LB
else:
break
return df
考虑只为一列编写函数,并使用 apply
:
def iqr(x):
IQR = np.diff(x.quantile([0.25,0.75]))[0]
S = 1.5*IQR
x[x < Q1 - S] = Q1 - S
x[x > Q3 + S] = Q1 + S
return x
df.select_dtypes('number') = df.select_dtypes('number').apply(iqr)
我在使用四分位数规则替换具有上下边界的离群值时遇到问题,内核 return 错误提示“必须指定轴 = 0 或 1”
定义四分位规则用上下边界替换异常值的函数代码如下:
def iqr(df):
for col in df.columns:
if df[col].dtype != object:
Q1 = df[col].quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
S = 1.5*IQR
LB = Q1 - S
UB = Q3 + S
df[df > UB] = UB
ddf[df < LB] = LB
else:
break
return df
dataframe是boston,可以从scikit learn加载
from sklearn.datasets import load_boston
df = pd.DataFrame(load_boston().data)
df.columns = boston.feature_names
df
然后,我使用函数将数值属性异常值替换为上限或下限
iqr(df)
但后来发现值错误
ValueError: Must specify axis=0 or 1
寻求帮助,谢谢!
为了帮助调试此代码,在加载 df
后,您可以设置 col
,然后 运行 来自 iqr
函数内部的单独代码行。
import pandas as pd
# Make some toy data. Could also load boston dataset.
df = pd.DataFrame(dict(a=[-10, 100], b=[-100, 25]))
df
# Get the name of the first data column.
col = df.columns[0]
col
# Check if Q1 calculation works.
Q1 = df[col].quantile(0.25)
Q1
...
在遍历列时,您应该始终使用 df[col],而不是 df,因为您只使用一列。因此,例如在您的代码中:
Q3 = df.quantile(0.75)
应该是
Q3 = df[col].quantile(0.75)
和
df[df > UB] = UB
应该是
df.loc[df > UB,col] = UB
等等……
无需过多更改您的函数,即可运行:
def iqr(df):
for col in df.columns:
if df[col].dtype != object:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
S = 1.5*IQR
LB = Q1 - S
UB = Q3 + S
df.loc[df[col] > UB,col] = UB
df.loc[df[col] < LB,col] = LB
else:
break
return df
考虑只为一列编写函数,并使用 apply
:
def iqr(x):
IQR = np.diff(x.quantile([0.25,0.75]))[0]
S = 1.5*IQR
x[x < Q1 - S] = Q1 - S
x[x > Q3 + S] = Q1 + S
return x
df.select_dtypes('number') = df.select_dtypes('number').apply(iqr)