在Pandas数据框中,用列分位数替换异常值

9

I have a dataframe:

df = pd.DataFrame(np.random.randint(0,100,size=(5, 2)), columns=list('AB'))
    A   B
0  92  65
1  61  97
2  17  39
3  70  47
4  56   6

以下是5%分位数:

down_quantiles = df.quantile(0.05)
A    24.8
B    12.6

这里是用于低于分位数的值的掩码:

outliers_low = (df < down_quantiles)
       A      B
0  False  False
1  False  False
2   True  False
3  False  False
4  False   True

我希望将df中低于分位数的值设置为所在列的分位数。可以按照以下方式进行操作:

df[outliers_low] = np.nan
df.fillna(down_quantiles, inplace=True)

    A   B
0  92.0  65.0
1  61.0  97.0
2  24.8  39.0
3  70.0  47.0
4  56.0  12.6

但是肯定有更优雅的方法。我如何在不使用fillna的情况下完成这个操作呢?谢谢。


你介意使用一行代码吗?df[~outliers_low].fillna(down_quantiles, inplace=True) - EdChum
我认为应该有更多本地的pandas方法来完成这个任务。而Nickil Maveli的回答清楚地展示了它。 - shda
是的,我忘记了“掩码”,我已经相应地为Nickil的答案点赞了。 - EdChum
1个回答

13
你可以使用 DF.mask() 方法。只要有 True 实例的存在,就可以通过提供 axis=1 参数,将其他系列的值替换成对齐的匹配列名称的值。
df.mask(outliers_low, down_quantiles, axis=1)  

另一种可能的变体是在使用反转布尔掩码(使用波浪符号~)后,使用DF.where()方法。

输入图像描述


df.where(~outliers_low, down_quantiles, axis=1)

这里输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接