这是两个系列。它们是在根据两个列值 patient_id 和 event_description 对数据框进行分组后生成的:
系列 1:
patient_id event_description
A DiagnosisA 2016-09-15
B DiagnosisA 2013-01-01
C DiagnosisA 2016-01-10
D DiagnosisA 2015-01-02
系列 2:
patient_id event_description
A DiagnosisB 2016-09-30
B DiagnosisB 2013-01-04
D DiagnosisB 2015-01-15
所以我基本上想找出每个患者之间的时间差异。例如,对于患者 A,它将返回 15 天,但对于患者 C,它可能会说“NaN”。
请您参考如下方法:
假设您的 groupby 包括 DiagnosisB 和 DiagnosisA,您可以预先unstack 并减去
# This should be what you have after groupby
s = pd.concat([s1, s2])
s
patient_id event_description
A DiagnosisA 2016-09-15
B DiagnosisA 2013-01-01
C DiagnosisA 2016-01-10
D DiagnosisA 2015-01-02
A DiagnosisB 2016-09-30
B DiagnosisB 2013-01-04
D DiagnosisB 2015-01-15
Name: Date, dtype: datetime64[ns]
然后你可以unstack和减法
s.unstack().pipe(lambda d: d.DiagnosisB - d.DiagnosisA)
patient_id
A 15 days
B 3 days
C NaT
D 13 days
dtype: timedelta64[ns]
不推荐
但是 unstack 和 squeeze 很有趣
s1.unstack().squeeze().rsub(s2.unstack().squeeze())
patient_id
A 15 days
B 3 days
C NaT
D 13 days
dtype: timedelta64[ns]
也不推荐
但是 xs 很有趣
s1.xs('DiagnosisA', level=1).rsub(s2.xs('DiagnosisB', level=1))
patient_id
A 15 days
B 3 days
C NaT
D 13 days
Name: Date, dtype: timedelta64[ns]
最终不推荐
必须显示 pd.IndexSlice
注意:索引需要完全按词法排序才能工作。
s1.loc[pd.IndexSlice[:, 'DiagnosisA']].rsub(s2.loc[pd.IndexSlice[:, 'DiagnosisB']])
patient_id
A 15 days
B 3 days
C NaT
D 13 days
Name: Date, dtype: timedelta64[ns]
