Получить процентили из сгруппированного фрейма данных - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть фрейм данных с двумя экспериментальными группами, и я пытаюсь получить процентильные распределения.Однако данные уже сгруппированы:

df = pd.DataFrame({'group': ['control', 'control', 'control','treatment','treatment','treatment'],
               'month': [1,4,9,2,5,12],
               'ct': [8,4,2,5,5,7]})

Я хочу рассчитать, какой месяц представляет 25-й, 50-й, 75-й процентиль каждой группы, но фрейм данных уже сгруппирован по переменным группы / месяца.

Обновление 1: я понимаю, что не прояснил проблему, с которой сталкиваюсь.Это сгруппированный кадр данных, поэтому, например, элемент управления имеет 8 точек данных, где month = 1, 4, где month = 4, и 2, где month = 9. Следующие процентили должны быть следующими:

x = pd.Series([1,1,1,1,1,1,1,1,4,4,4,4,9,9)]
x.quantile([0.25,0.5,0.75])
>> 0.25    1.0
   0.50    1.0
   0.75    4.0
   dtype: float64

Группировка по группам и принятие квантилей не дает точного ответа.Есть ли способ разбить число и взять процентили не сгруппированных значений?Конечный объект должен иметь следующие значения:

             p25 p50 p75
control      1   1   4
treatment    2   5   12

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

Вы можете использовать Series.repeat и затем получить квантили:

df.groupby('group').apply(lambda x: (x.month.repeat(x.ct)).quantile([0.25, 0.5, 0.75])).rename_axis([None], axis=1)

           0.25  0.50  0.75
group                      
control     1.0   1.0   4.0
treatment   2.0   5.0  12.0
0 голосов
/ 03 февраля 2019

Вы можете проверить describe

df.groupby('group').describe().stack()
0 голосов
/ 02 февраля 2019

Вы можете попробовать использовать pd.quanitle с требуемыми процентами в виде списка

df.groupby('group').quantile([0.25,0.50,0.75])

Out:

                    ct  month
group           
control     0.25    3.0 2.5
            0.50    4.0 4.0
            0.75    6.0 6.5
treatment   0.25    5.0 3.5
            0.50    5.0 5.0
            0.75    6.0 8.5
...