web-dev-qa-db-fra.com

Élimination de toutes les données sur un centile donné

J'ai un pandas DataFrame appelé data avec une colonne appelée ms. Je veux éliminer toutes les lignes où data.ms est supérieur au 95%. Pour l'instant, je fais ceci:

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

qui fonctionne, mais je veux généraliser cela à n'importe quel centile. Quelle est la meilleure façon de procéder?

30
Roy Smith

Utilisez la méthode 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

Pour filtrer les lignes de dfdf.a est supérieur ou égal au 95e centile do:

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
63
Phillip Cloud

numpy est beaucoup plus rapide que Pandas pour ce genre de choses:

numpy.percentile(df.a,95) # attention : the percentile is given in percent (5 = 5%)

est équivalent mais 3 fois plus rapide que:

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

donc pour votre code, cela donne:

df[df.a < np.percentile(df.a,95)]
25
2diabolos.com