2 个日期列比较以指示一条记录是否在另一条记录之后发生

问题描述 投票:0回答:1

我有一个数据框,我想返回在诊断疾病后进行后续随访的 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() 应用于指示患者在诊断预约后进行了随访的标志。关于重塑数据和生成标志的基本方法的建议会很棒。

python pandas transformation
1个回答
0
投票

假设您的数据中有拼写错误,并且

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
© www.soinside.com 2019 - 2024. All rights reserved.