[英]Replace the Outlier in a group with the mean of the group in a pandas series
在下面的dataframe中,我想用組的模式替換EMI列中的異常值。 這是示例數據。
ID | C_Id | 電磁干擾 |
---|---|---|
1個 | 1000 | 141 |
2個 | 1000 | 141 |
3個 | 1000 | 21538 |
4個 | 2000 | 313 |
5個 | 2000 | 313 |
6個 | 2000 | 31528 |
7 | 3000 | 0 |
8個 | 3000 | 0 |
9 | 3000 | 3000 |
10 | 3000 | 4000 |
我期待 output 是這樣的。
ID | C_Id | 電磁干擾 |
---|---|---|
1個 | 1000 | 141 |
2個 | 1000 | 141 |
3個 | 1000 | 141 |
4個 | 2000 | 313 |
5個 | 2000 | 313 |
6個 | 2000 | 313 |
7 | 3000 | 0 |
8個 | 3000 | 0 |
9 | 3000 | 0 |
10 | 3000 | 0 |
第一步是計算模式:
from scipy import stats
modes = df.groupby('C_Id').agg({'EMI':lambda x:stats.mode(x)[0]}).reset_index()
modes
這會給你:
C_Id | 電磁干擾 | |
---|---|---|
0 | 1000 | 141 |
1個 | 2000 | 313 |
2個 | 3000 | 0 |
那么就看你對“離群值”的定義了。 如果您只是意味着離群值是不同於模式的值,那么它很簡單:
df.drop(columns = ['EMI']).merge(modes, on=['C_Id'])
ID | C_Id | 電磁干擾 | |
---|---|---|---|
0 | 1個 | 1000 | 141 |
1個 | 2個 | 1000 | 141 |
2個 | 3個 | 1000 | 141 |
3個 | 4個 | 2000 | 313 |
4個 | 5個 | 2000 | 313 |
5個 | 6個 | 2000 | 313 |
6個 | 7 | 3000 | 0 |
7 | 8個 | 3000 | 0 |
8個 | 9 | 3000 | 0 |
9 | 10 | 3000 | 0 |
但是,如果您有一些標准,您可以這樣做:
merged = df.merge(modes, on=['C_Id'], suffixes=['', '_y'])
merged['replacement'] = merged.EMI.gt(merged.EMI_y*10) # use your criteria of outlier here
merged.loc[merged.replacement,'EMI'] = merged.loc[merged.replacement,'EMI_y']
merged.drop(columns=['EMI_y', 'replacement'])
對於您的示例用例,它仍然會給出相同的 output 但其比較將基於您設置的標准:
ID | C_Id | 電磁干擾 | |
---|---|---|---|
0 | 1個 | 1000 | 141 |
1個 | 2個 | 1000 | 141 |
2個 | 3個 | 1000 | 141 |
3個 | 4個 | 2000 | 313 |
4個 | 5個 | 2000 | 313 |
5個 | 6個 | 2000 | 313 |
6個 | 7 | 3000 | 0 |
7 | 8個 | 3000 | 0 |
8個 | 9 | 3000 | 0 |
9 | 10 | 3000 | 0 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.