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哈哈,谢谢老兄。还是不太熟悉管道,应该多学点,很酷。这感觉像是魔术师,对管道不太熟悉的人应该学习更多关于它的知识,它很酷。这感觉像魔术