繁体   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