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
我有一个 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