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