我有一个数据框,我想返回跨部门诊断疾病后进行后续随访的患者数量(比例)。
示例;患者可以跨多个科室进行
diag_yn
,但我想检查患者是否像以前一样对每个科室进行了随访。
因此,例如,患者 1 将被记录两次,放射科各记录一次,呼吸科各记录一次,因为两个科室都有后续预约。
原DF
dept | patient_id | app_date | diag_date | diag_yn |
|------------|------------|------------|------------|-----------|
Radiology | 1 | 2024-01-11 | NaT | NaN |
Radiology | 1 | 2024-03-14 | 2024-03-14 | 1 |
Radiology | 1 | 2024-04-09 | NaT | NaN |
Radiology | 1 | 2024-09-09 | NaT | NaN |
Respiratory | 1 | 2024-02-11 | NaT | NaN |
Respiratory | 1 | 2024-04-14 | 2024-04-14 | 1 |
Respiratory | 1 | 2024-06-09 | NaT | NaN |
Respiratory | 1 | 2024-09-09 | NaT | NaN |
Respiratory | 2 | 2024-01-11 | NaT | NaN |
Respiratory | 2 | 2024-03-14 | 2024-03-14 | 1 |
Respiratory | 2 | 2024-04-09 | NaT | NaN |
Respiratory | 2 | 2024-09-09 | NaT | NaN |
所需输出
dept | patient_with_fup | count |
Radiology |------------------|-------|
| 1 | 1 |
| 0 | 0 |
Respiratory |------------------|-------|
| 1 | 2 |
| 0 | 0 |
已提供以下代码,但在
dept
列添加到 DF 之前。
(df.groupby('patient_id')
.apply(lambda g: g['app_date'].gt(next(iter(g['diag_date'].dropna()),
pd.NaT)).any(),
include_groups=False)
.astype(int).value_counts()
.reindex([0, 1], fill_value=0).rename_axis('fup_yn')
.reset_index()
)
不知道我是否理解正确,但你可以尝试这样的事情:
def check_follow_up(g):
diag_date = g['diag_date'].dropna().max()
if pd.isna(diag_date):
return 0
return int((g['app_date'] > diag_date).any())
result = (df.groupby(['dept', 'patient_id'])
.apply(check_follow_up)
.reset_index(name='patient_follow_up')
.groupby(['dept', 'patient_follow_up'])
.size()
.reset_index(name='count')
)
这应该按患者 ID 和科室对其进行分组,如果有效请告诉我