Вычислить произвольную процентную долю на Pandas GroupBy

В настоящее время существует метод median для объектов Pandas GroupBy.

Есть ли способ вычислить произвольное percentile (см. http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html) для группировок?

Медиана была бы вычислением процентиля с q=50.

Ответ 1

Вам нужен метод quantile:

In [47]: df
Out[47]: 
           A         B    C
0   0.719391  0.091693  one
1   0.951499  0.837160  one
2   0.975212  0.224855  one
3   0.807620  0.031284  one
4   0.633190  0.342889  one
5   0.075102  0.899291  one
6   0.502843  0.773424  one
7   0.032285  0.242476  one
8   0.794938  0.607745  one
9   0.620387  0.574222  one
10  0.446639  0.549749  two
11  0.664324  0.134041  two
12  0.622217  0.505057  two
13  0.670338  0.990870  two
14  0.281431  0.016245  two
15  0.675756  0.185967  two
16  0.145147  0.045686  two
17  0.404413  0.191482  two
18  0.949130  0.943509  two
19  0.164642  0.157013  two

In [48]: df.groupby('C').quantile(.95)
Out[48]: 
            A         B
C                      
one  0.964541  0.871332
two  0.826112  0.969558

Ответ 2

Я нашел другое полезное решение здесь

Если мне нужно использовать groupby другой подход может быть:

def percentile(n):
    def percentile_(x):
        return np.percentile(x, n)
    percentile_.__name__ = 'percentile_%s' % n
    return percentile_

Используя приведенный ниже вызов, я могу достичь того же результата, что и решение, данное @TomAugspurger

df.groupby('C').agg([percentile(50), percentile(95)])