回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>假设我有一个数据集,其中包含了入住重症监护病房的病人心率的时间序列。你知道吗</p>
<p>我想补充一些纳入标准,例如,我只想考虑心率大于等于90的患者至少一小时的ICU住院时间。如果一小时后第一次测量的心率(从>;=90开始)未知,我们假设它高于90,并包括ICU住院时间。你知道吗</p>
<p>ICU住院的条目应包括从与“至少1小时”时间间隔相对应的第一次测量开始。你知道吗</p>
<p>请注意,一旦ICU住院被包括在内,它就再也不会被排除,即使心率在某个时候降到90以下。你知道吗</p>
<p>因此,下面的数据框中,“Icustay”对应于在ICU停留的唯一ID,“Hours”表示自进入ICU以来在ICU停留的时间</p>
<pre><code> Heart Rate Hours Icustay Inclusion Criteria
0 79 0.0 1001 0
1 91 1.5 1001 0
2 NaN 2.7 1001 0
3 85 3.4 1001 0
4 90 0.0 2010 0
5 94 29.4 2010 0
6 68 0.0 3005 0
</code></pre>
<p>应该变成</p>
<pre><code> Heart Rate Hours Icustay Inclusion Criteria
0 79 0.0 1001 0
1 91 1.5 1001 1
2 NaN 2.7 1001 1
3 85 3.4 1001 1
4 90 0.0 2010 1
5 94 29.4 2010 1
6 68 0.0 3005 0
</code></pre>
<p>我已经为此编写了代码,而且很有效。但是它非常慢,在处理我的整个数据集时,每个患者最多需要几秒钟的时间(实际上,我的数据集包含的数据多于6个字段,但是为了更好的可读性,我简化了它)。既然有4万病人,我想加快速度。你知道吗</p>
<p>这是我目前正在使用的代码,以及我上面介绍的玩具数据集。你知道吗</p>
<pre><code>import numpy as np
import pandas as pd
d = {'Icustay': [1001, 1001, 1001, 1001, 2010, 2010, 3005], 'Hours': [0, 1.5, 2.7, 3.4, 0, 29.4, 0],
'Heart Rate': [79, 91, np.NaN, 85, 90, 94, 68], 'Inclusion Criteria':[0, 0, 0, 0, 0, 0, 0]}
all_records = pd.DataFrame(data=d)
for curr in np.unique(all_records['Icustay']):
print(curr)
curr_stay = all_records[all_records['Icustay']==curr]
indexes = curr_stay['Hours'].index
heart_rate_flag = False
heart_rate_begin_time = 0
heart_rate_begin_index = 0
for i in indexes:
if(curr_stay['Heart Rate'][i] >= 90 and not heart_rate_flag):
heart_rate_flag = True
heart_rate_begin_time = curr_stay['Hours'][i]
heart_rate_begin_index = i
elif(curr_stay['Heart Rate'][i] < 90):
heart_rate_flag = False
elif(heart_rate_flag and curr_stay['Hours'][i]-heart_rate_begin_time >= 1.0):
all_records['Inclusion Criteria'].iloc[indexes[indexes>=heart_rate_begin_index]] = 1
break
</code></pre>
<p>请注意,数据集是按患者和小时排序的。你知道吗</p>
<p>有没有办法加快速度?我考虑过像groupby这样的内置函数,但我不确定它们在这种特殊情况下是否有用。你知道吗</p>