Python 尝试根据相应的指数减去两个不同系列之间的值

Python 尝试根据相应的指数减去两个不同系列之间的值,python,pandas,series,Python,Pandas,Series,以下是两个系列。它们是根据两列值对数据帧进行分组后生成的,patient\u id和event\u description: 系列1: patient_id event_description A DiagnosisA 2016-09-15 B

以下是两个系列。它们是根据两列值对数据帧进行分组后生成的,
patient\u id
event\u 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.

如果
事件描述
列在这里没有作用,我建议将其删除。调用
reset\u index
并减去结果

r1 = df1.reset_index(level=1, drop=1)
r2 = df2.reset_index(level=1, drop=1)

r = r2.sub(r1)

r
           time
patient_id        
A          15 days
B           3 days
C              NaT
D          13 days

如果
event\u description
列在这里没有任何作用,我建议将其删除。调用
reset\u index
并减去结果

r1 = df1.reset_index(level=1, drop=1)
r2 = df2.reset_index(level=1, drop=1)

r = r2.sub(r1)

r
           time
patient_id        
A          15 days
B           3 days
C              NaT
D          13 days

您可以使用
reset\u index
,我们也可以使用
droplevel

df2.index = df2.index.droplevel(1)
df1.index = df1.index.droplevel(1)

df2 - df1
输出:

time patient_id A 15 days B 3 days C NaT D 13 days 时间 病人编号 A 15天 B三天 C纳特 D 13天
您可以使用
reset\u index
,我们也可以使用
droplevel

df2.index = df2.index.droplevel(1)
df1.index = df1.index.droplevel(1)

df2 - df1
输出:

time patient_id A 15 days B 3 days C NaT D 13 days 时间 病人编号 A 15天 B三天 C纳特 D 13天
假设您的
groupby
同时包含
DiagnosisB
DiagnosisA
,您可以
事先取消堆栈
并减去

# 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]
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]
然后您可以
取消堆叠
并减去

# 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]
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]

不推荐使用
但是使用
取消堆叠
挤压


也不推荐使用
但是玩
xs很有趣


最终非推荐
必须显示
pd.indexlice

注意:需要对索引进行完全排序,这样才能工作

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]

假设您的
groupby
同时包含
DiagnosisB
DiagnosisA
,您可以
事先取消堆栈
并减去

# 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]
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]
然后您可以
取消堆叠
并减去

# 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]
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]

不推荐使用
但是使用
取消堆叠
挤压


也不推荐使用
但是玩
xs很有趣


最终非推荐
必须显示
pd.indexlice

注意:需要对索引进行完全排序,这样才能工作

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]

输出不是零吗?@Bharathshetty如果它们是datetimes,结果将是一个时间增量,除非我遗漏了什么。r2-r2相互取消哈哈:)@Bharathshetty LOL谢谢老兄。输出不是零吗?@Bharathshetty如果它们是datetimes,结果将是一个时间增量,除非我错过了什么。r2-r2互相取消哈哈:)@Bharathshetty哈哈,谢谢老兄。还是不太熟悉管道,应该多学点,很酷。这感觉像是魔术师,对管道不太熟悉的人应该学习更多关于它的知识,它很酷。这感觉像魔术