我有一个数据框和字典,如下所示
df = pd.DataFrame({
'subject_id':[1,2,3,4,5],'age':[42,56,75,48,39],'date_visit':['1/1/2020','3/3/2200','13/11/2100','24/05/2198','30/03/2071'],'a11fever':['Yes','No','Yes','No'],'a12diagage':[36,np.nan,40,np.nan],'a12diagyr':[np.nan,2091,'a12diagyrago':[6,9,'a20cough':['Yes','a21cough':[np.nan,'a22agetold':[37,46,'a22yrsago':[np.nan,6,'a22yrtold':[np.nan,2194,np.nan]
})
df['date_visit'] = pd.to_datetime(df['date_visit'])
disease_dict = {'a11fever' : 'fever','a20cough' : 'cough','a21cough':'cough'}
此数据框包含有关患者的医疗状况和诊断日期的信息
但是正如您所见,诊断日期不直接可用,我们必须根据包含age
,yr
,{{ 1}},ago
,它们出现在条件列的下5-6列中(例如:diag
)。在此条件列之后查找接下来的5列,您将能够获取导出日期所需的信息。a11fever
我希望我的输出如下所示
我正在尝试类似下面的操作,但没有帮助
cough
请注意,我之前已经知道疾病的列名(请参阅dict)。我不知道实际的列名是从哪里获得所需的信息以得出日期的。但我知道它包含df = df[(df['a11fever'] =='Yes') | (df['a20cough'] =='Yes') | (df['a21cough'] =='Yes')]
# we filter by `Yes` above because we only nned to get dates for people who had medical condition (`fever`,`cough`)
df.fillna(0,inplace=True)
df['diag_date'] = df["date_visit"] - pd.DateOffset(years=df.filter('age'|'yr'|'ago')) # doesn't help throws error. need to use regex here to select non-na values any of other columns
pd.wide_to_long(df,stubnames=['condition','diag_date'],i='subject_id',j='grp').sort_index(level=0)
df.melt('subject_id',value_name='valuestring').sort_values('subject_id')
,age
,ago
,yr
diag
是通过从diag_date
列中减去derived date
来获得的。
规则屏幕截图
例如:date_vist
于subject_id = 1
因发烧而去医院,他被诊断出年龄为1/1/2020
(36
)或a12diagage
岁({{ 1}})。我们知道他的当前年龄和date_visit,因此我们可以选择从任意列中减去6
如您所见,我无法找出如何基于正则表达式选择一列并将其减去