2013-07-10 5 views
12

Я хочу передать функцию numpy percentile() через функцию agg() pandas, как показано ниже, с различными другими функциями статистики numpy.Передача процентилей в функцию pandas agg

Прямо сейчас у меня есть dataframe, который выглядит следующим образом:

AGGREGATE MY_COLUMN 
A   10 
A   12 
B   5 
B   9 
A   84 
B   22 

И мой код выглядит следующим образом:

grouped = dataframe.groupby('AGGREGATE') 
column = grouped['MY_COLUMN'] 
column.agg([np.sum, np.mean, np.std, np.median, np.var, np.min, np.max]) 

Приведенный выше код работает, но я хочу сделать что-то вроде

column.agg([np.sum, np.mean, np.percentile(50), np.percentile(95)]) 

ie указать различные процентили для возврата из agg()

Как это сделать?

+2

Это, вероятно, новый аспект панд, но смотреть на http://stackoverflow.com/questions/19894939/calculate-arbitrary-percentile- на панд-GroupBy. TLDR: df.groupby ('C'). Quantile (.95) –

ответ

29

Возможно, не очень эффективным, но один из способов было бы создать функцию самостоятельно:

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

Затем включите это в agg:

In [11]: column.agg([np.sum, np.mean, np.std, np.median, 
        np.var, np.min, np.max, percentile(50), percentile(95)]) 
Out[11]: 
      sum  mean  std median   var amin amax percentile_50 percentile_95 
AGGREGATE 
A   106 35.333333 42.158431  12 1777.333333 10 84    12   76.8 
B   36 12.000000 8.888194  9 79.000000  5 22    12   76.8 

Примечание уверена, что это как должен сделайте это ...

+0

, который выглядит хорошо ..... PLS добавить к поваренной книге, когда у вас есть шанс – Jeff

+0

уверенная вещь, пойдет через кулинарию в конце недели и добавит несколько другие. –

+1

на самом деле .... может быть '' Series.describe'' должен взять '' quantiles'' arg? (и избавиться от '' percentile_width''), который мог бы взять список, например. '' .describe (квантили [50,95]) ''? – Jeff

3

Более конкретно, если вы хотите просто заполнить результаты своей группы pandas, используя th e percentile, функция лямбда python предлагает довольно аккуратное решение. Используя обозначения на вопрос, в агрегировании по процентилям 95, должно быть:

dataframe.groupby('AGGREGATE').agg(lambda x: np.percentile(x['COL'], q = 95)) 

Вы также можете назначить эту функцию переменного и использовать его в сочетании с другими функциями агрегирования.

1

Попробуйте это на 50% и 95% процентили:

column.describe(percentiles = [ 0.5, 0.95 ]) 
Смежные вопросы