Skip to main content
 首页 » 编程设计

python之尝试根据相应的索引减去两个不同 Pandas 系列之间的值

2025年05月04日11me-sa

这是两个系列。它们是在根据两个列值 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]