Агрегирование по процентилям и подсчет для групп в python - PullRequest
0 голосов
/ 06 марта 2020

Я новый python пользователь, знакомый с R.

Я хочу рассчитать определяемые пользователем квантили для групп с количеством наблюдений в каждой группе.

В RI будет делать:

df_sum <- df %>% group_by(group) %>% 
  dplyr::summarise(q85 = quantile(obsval, probs = 0.85, type = 8),
                   n = n())

В python я могу получить сгруппированный процентиль по:

df_sum = df.groupby(['group'])['obsval'].quantile(0.85)

Как мне добавить к этому счетчик групп?

I пробовал:

df_sum = df.groupby(['group'])['obsval'].describe(percentile=[0.85])[[count]]
df_sum = df.groupby(['group'])['obsval'].quantile(0.85).describe(['count'])

Пример данных:

data = {'group':['A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'A'], 'obsval':[1, 3, 3, 5, 4, 6, 7, 7, 8]}
df = pd.DataFrame(data)
df

Ожидаемый результат:

group  percentile count
A       7.4        5
B       6.55       4

1 Ответ

0 голосов
/ 06 марта 2020

Вы можете использовать pandas.DataFrame.agg() для применения нескольких функций.
В этом случае вам следует использовать numpy.quantile().

import pandas as pd
import numpy as np

data = {'group':['A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'A'], 'obsval':[1, 3, 3, 5, 4, 6, 7, 7, 8]}
df = pd.DataFrame(data)
df_sum = df.groupby(['group'])['obsval'].agg([lambda x : np.quantile(x, q=0.85), "count"])
df_sum.columns = ['percentile', 'count']
print(df_sum)
...