pandas dataframe 如何替换所有列的极端异常值

pandas dataframe how to replace extreme outliers for all columns

我有一个 pandas 数据框,它有一些非常极端的值——超过 5 个标准差。 我想用最大其他值替换每列大于 5 std 的每个值。 例如,

df = A B
     1 2
     1 6
     2 8
     1 115
     191 1

将成为:

df = A B
     1 2
     1 6
     2 8
     1 8
     2 1

在列上不使用 for 循环的最佳方法是什么?

计算按列的 z 分数(如果您认为某物位于列的给定标准差数之外,则为异常值),然后计算超出所需范围的值的布尔掩码

def calc_zscore(col):
   return (col - col.mean()) / col.std()

zscores = df.apply(calc_zscore, axis=0)
outlier_mask = zscores > 5

之后由您来填充标有布尔掩码的值。

df[outlier_mask] = something

根据评论中的讨论,您需要决定您的阈值是多少。说是q=100,那么可以做

q = 100
df.loc[df['A'] > q,'A'] = max(df.loc[df['A'] < q,'A'] )
df

这修复了 A 列:


    A   B
0   1   2
1   1   6
2   2   8
3   1   115
4   2   1

对 B 做同样的事情

s=df.mask((df-df.apply(lambda x: x.std() )).gt(5))#mask where condition applies
s=s.assign(A=s.A.fillna(s.A.max()),B=s.B.fillna(s.B.max())).sort_index(axis = 0)#fill with max per column and resort frame

    A    B
0  1.0  2.0
1  1.0  6.0
2  2.0  8.0
3  1.0  8.0
4  2.0  1.0