如何使用多列 pandas 删除异常值?
How do i remove outliers using multiple columns pandas?
在我的整个数据框中,我有两列价格和数量。这些都包含异常值。我如何删除这两列中的异常值,以便返回的数据框排除这两列中的异常值?我可以将它应用于一列,但不确定如何将它应用于两列。
我试过以下方法
def make_mask(df, column):
standardized = (df[column] - df[column].mean())/df[column].std()
return standardized.abs() >= 2
def filter_outliers(df, columns):
print(columns)
masks = (make_mask(df, column) for column in columns)
print(masks)
full_mask = np.logical_or.reduce(masks)
print(full_mask)
return df[full_mask]
outliersremoved_df=filter_outliers(df,['price','qty'])
我用过这个,但我一次只能将它应用到一列:
def remove_outlier(df_in, col_name):
q1 = df_in[col_name].quantile(0.25)
q3 = df_in[col_name].quantile(0.75)
iqr = q3-q1 #Interquartile range
fence_low = q1-1.5*iqr
fence_high = q3+1.5*iqr
df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]
return df_out
前 2 个函数出错:
ValueError: too many values to unpack (expected 1)
请使用以下函数,该函数适用于您在 #df
中的所有列
def cap_data(df):
for col in df.columns:
print("capping the ",col)
if (((df[col].dtype)=='float64') | ((df[col].dtype)=='int64')):
percentiles = df[col].quantile([0.01,0.99]).values
df[col][df[col] <= percentiles[0]] = percentiles[0]
df[col][df[col] >= percentiles[1]] = percentiles[1]
else:
df[col]=df[col]
return df
final_df=cap_data(df)
在我的整个数据框中,我有两列价格和数量。这些都包含异常值。我如何删除这两列中的异常值,以便返回的数据框排除这两列中的异常值?我可以将它应用于一列,但不确定如何将它应用于两列。
我试过以下方法
def make_mask(df, column):
standardized = (df[column] - df[column].mean())/df[column].std()
return standardized.abs() >= 2
def filter_outliers(df, columns):
print(columns)
masks = (make_mask(df, column) for column in columns)
print(masks)
full_mask = np.logical_or.reduce(masks)
print(full_mask)
return df[full_mask]
outliersremoved_df=filter_outliers(df,['price','qty'])
我用过这个,但我一次只能将它应用到一列:
def remove_outlier(df_in, col_name):
q1 = df_in[col_name].quantile(0.25)
q3 = df_in[col_name].quantile(0.75)
iqr = q3-q1 #Interquartile range
fence_low = q1-1.5*iqr
fence_high = q3+1.5*iqr
df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]
return df_out
前 2 个函数出错:
ValueError: too many values to unpack (expected 1)
请使用以下函数,该函数适用于您在 #df
中的所有列def cap_data(df):
for col in df.columns:
print("capping the ",col)
if (((df[col].dtype)=='float64') | ((df[col].dtype)=='int64')):
percentiles = df[col].quantile([0.01,0.99]).values
df[col][df[col] <= percentiles[0]] = percentiles[0]
df[col][df[col] >= percentiles[1]] = percentiles[1]
else:
df[col]=df[col]
return df
final_df=cap_data(df)