簡體   English   中英

將組中的異常值替換為 pandas 系列中組的平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM