У меня есть фрейм данных с двумя экспериментальными группами, и я пытаюсь получить процентное распределение. Однако данные уже сгруппированы:
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 точек данных, где месяц = 1, 4, где месяц = 4, и 2, где месяц = 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






Вы можете попробовать использовать pd.quanitle с требуемыми процентами в виде списка
df.groupby('group').quantile([0.25,0.50,0.75])
Вне:
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
Вы можете использовать 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
Вы можете проверить describe
df.groupby('group').describe().stack()