消除给定百分位数的所有数据

时间:2013-09-02 20:37:48

标签: python pandas filtering percentile

我有一个名为DataFrame的大熊猫data,其中一列名为ms。我想消除data.ms高于95%百分位数的所有行。现在,我这样做:

limit = data.ms.describe(90)['95%']
valid_data = data[data['ms'] < limit]

哪个有效,但我想把它推广到任何百分位数。最好的方法是什么?

2 个答案:

答案 0 :(得分:59)

使用Series.quantile()方法:

In [48]: cols = list('abc')

In [49]: df = DataFrame(randn(10, len(cols)), columns=cols)

In [50]: df.a.quantile(0.95)
Out[50]: 1.5776961953820687

要过滤dfdf.a大于或等于第95百分位数的行:

In [72]: df[df.a < df.a.quantile(.95)]
Out[72]:
       a      b      c
0 -1.044 -0.247 -1.149
2  0.395  0.591  0.764
3 -0.564 -2.059  0.232
4 -0.707 -0.736 -1.345
5  0.978 -0.099  0.521
6 -0.974  0.272 -0.649
7  1.228  0.619 -0.849
8 -0.170  0.458 -0.515
9  1.465  1.019  0.966

答案 1 :(得分:22)

对于这类事情,numpy比熊猫快得多:

df.a.quantile(.95)  # as you already noticed here it is ".95" not "95"

相当于但比以下快3倍:

df[df.a < np.percentile(df.a,95)]

所以对于你的代码,它给出了:

{{1}}