我有一个数据框,我想返回在诊断疾病后进行后续随访的 Patinet 的数量(比例)。
原始 DF(1 个患者示例)
| patient_id | app_date | diag_date | cancer_yn |
|------------|------------|------------|-----------|
| 1 | 2024-01-11 | NaT | NaN |
| 1 | 2024-03-14 | 2024-03-14 | 1 |
| 1 | 2024-04-09 | NaT | NaN |
| 1 | 2024-09-09 | NaT | NaN |
中级 DF(表示每位患者的预约记录是否是诊断日期的跟进)
| patient_id | app_date | diag_date | cancer_yn | fup_yn |
|------------|------------|------------|-----------|--------|
| 1 | 2024-01-11 | NaT | NaN | 0 |
| 1 | 2024-03-14 | 2024-03-14 | 1 | 0 |
| 1 | 2024-04-09 | NaT | NaN | 1 |
| 1 | 2024-09-09 | NaT | NaN | 1 |
总结 DF(已折叠,通过
patient_id
和 value_counts()
上的 groupby 或应用类似的内容
| patient_with_fup | count |
|------------------|-------|
| 1 | 24 |
| 0 | 67 |
您可以看到第二条记录表明进行诊断的预约(
diag_date
可用,与app_date
相同),该患者已经有后续预约,我想标记情况是这样的(说follow_ups == 1
) .
我发现很难理解如何对不同的患者进行分组,并将 value_counts() 应用于指示患者在诊断预约后进行了随访的标志。关于重塑数据和生成标志的基本方法的建议会很棒。
假设您的数据中有拼写错误,并且
2022-03-14
是 2024-03-14
,您可以通过 groupby.transform
识别后续预约:
# ensure datetime
df[['app_date', 'diag_date']] = df[['app_date', 'diag_date']
].apply(pd.to_datetime)
df['fup_yn'] = (df.groupby('patient_id')['diag_date']
.transform('first').lt(df['app_date'])
.astype(int)
)
输出:
patient_id app_date diag_date cancer_yn fup_yn
0 1 2024-01-11 NaT NaN 0
1 1 2024-03-14 2024-03-14 1.0 0
2 1 2024-04-09 NaT NaN 1
3 1 2024-09-09 NaT NaN 1
对于最终的输出,你并不需要这个中间体,你可以直接使用:
(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()
)
输出:
fup_yn count
0 0 0
1 1 1