Отказ от ответственности: я врач без формального обучения, которому поручено составить отчет о том, сколько пациентов достигают целей терапии, и мне нужно разбить его по учреждениям и клиникам. Я могу получить знаменатель (общее количество случаев по учреждениям и клиникам) и числитель (общее количество случаев, соответствующих терапевтическим целям), но я не могу понять, как отобразить оба этих показателя в группе вместе со столбцом, показывающим процент достижения целей ( число/номинал).
Образец кадра данных:
import pandas as pd
df = pd.DataFrame([[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
['anxiety','PTSD','PTSD','anxiety','PTSD','depression','anxiety','anxiety','PTSD','anxiety','anxiety','anxiety','depression','depression','PTSD'],
[False,False,False,True,True,False,True,False,False,False,False,False,False,False,False],
['120C','120C','120C','120C','120C','120C','120C','120C','120C','120C','375C','375C','375C','375C','375C'],
['BH-PSYL','BH-PSYL','BH-YUKON','BH-DENALI','BH-YUKON','BH-DENALI','BH-CFS','BH-CFS','BH-CFS','BH-CFS','BH-HTHPSY','BH-HTHPSY','BH-BSS','BH-HTHPSY','BH-BSS']]).T
df.columns = ['Patient ID','DX Category','Met Goal','Facility','Clinic']
Это дает знаменатель:
df.groupby(['Facility', 'Clinic']).count()[['Met Goal']]
Это дает числитель:
df[df['Met Goal'] == True].groupby(['Facility', 'Clinic']).count()[['Met Goal']]
Окончательный результат должен показать (выдуманные числа):
Facility | Clinic | Met Goal | Cases | Percent
120C
| BH-PSYL | 1 | 4 | 25%
| BH-YUKON | 2 | 6 | 33%
375C
| BH-CFS | 0 | 1 | 0%
Любая помощь приветствуется!
Вы проделали большую часть работы, но чтобы получить окончательный результат, вы можете сделать следующее:
#first calculate at once the numerator and denominator in the same dataframe
df_final = df.groupby(['Facility', 'Clinic']).agg({'Met Goal':['sum', 'count']})
#then change the name of the columns
df_final.columns = ['Met Goal','Cases']
#finally calaulate the percent
df_final['Percent'] = df_final['Met Goal']/df_final['Cases']
и вы получаете:
print (df_final)
Met Goal Cases Percent
Facility Clinic
120C BH-CFS 1 4 0.25
BH-DENALI 1 2 0.50
BH-PSYL 0 2 0.00
BH-YUKON 1 2 0.50
375C BH-BSS 0 2 0.00
BH-HTHPSY 0 3 0.00
Добавление df_final['Met Goal'] = df_final['Met Goal'].astype(int)
после переименования столбцов, кажется, исправляет это, хотя я до сих пор не понимаю, почему это работало без него для двух столбцов, а не для трех. пожимание плечами
@pediatrictactic, что я могу сказать по вашей картинке, так это то, что sum
не преобразует логическое значение True/False
в int
, если в группе есть только одно значение. Это не напрямую из-за третьего столбца в groupby, а из-за того, что ваш набор данных слишком мал. Это интересный результат, я посмотрю на него позже !! но ваш способ исправить это с помощью astype
- хорошее решение :)
@pediatrictactic, по-видимому, какое-то время это известная проблема, но это еще не исправлено. Так что я думаю, что использование astype
- это безопасная работа для ваших нужд :)
Вопрос F/U - если я добавлю третий столбец в группу, [он больше не правильно интерпретирует True/False] (imgur.com/a/0vRUKI). Этот метод работает только при использовании двух столбцов?