我有一個非常極端的熊貓資料框 - 超過 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回圈在列上的最佳方法是什么?
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
根據評論中的討論,您需要確定您的閾值是多少。說是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 做同樣的事情
uj5u.com熱心網友回復:
計算按列的 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409483.html
標籤:
上一篇:列子集的條件行和dplyr
