我正在使用一些数据,我必须得到发生日期。例如,假设我们正在处理医疗数据。每行都是来自患者的独特访问,尽管同一患者可以有多行。每行还包含有关访问类型的信息,无论是常规还是急诊室。
我需要经历,并且在每次访问之前,先获取患者之前进入急诊室的日期。例如,我想添加一列previous_er_discharge_date,如下所示:
visit_id patient_id discharge_date visit_type previous_er_discharge_date
1 abc 2014-05-05 in-patient 2014-05-01
2 abc 2014-05-01 emergency NaT
3 def 2014-04-18 in-patient NaT
4 def 2014-03-12 in-patient 2014-02-12
5 def 2014-02-12 emergency NaT
所以我有一些工作,但它很慢。我基本上只是创建一个单独的ER访问数据框,并遍历主数据框,并查找该患者是否存在先前的ER日期,如果是,我采取第一个。 (数据按discharge_date排序)。我所拥有的代码的一般表示。
er_visits = main_data[main_data.visit_type=='emergency']
prev_dates = []
for index, row in main_data.iterrows():
dates = er_visits.discharge_date[(er_visits.patient_id==row.patient_id) &
(er_visits.discharge_date < row.discharge_date)].values
if len(dates) > 0:
prev_dates.append(dates[0])
else:
prev_dates.append(pd.NaT)
上面的代码有效,但速度很慢,我希望能帮助找到更快的方法来实现这一目标。我正在使用的数据集有几十万行,这是必须每天运行的东西。
谢谢!
答案 0 :(得分:13)
在熊猫中,你基本上想要避免循环,因为它们会破坏性能。
她是一个类似于你的数据框架(我对日期很懒,所以它们是整齐的;这是同样的想法)。
df = pd.DataFrame({
'id': ['abc', 'abc', 'def', 'def', 'def'],
'date': [505, 501, 418, 312, 212]})
这是一个函数,对于每个组,都附加上一个日期:
def prev_dates(g):
g.sort(columns=['date'])
g['prev'] = g.date.shift(-1)
return g
所以所需要的就是连接东西:
>> df.groupby(df.id).apply(prev_dates)
date id prev
0 505 abc 501
1 501 abc NaN
2 418 def 312
3 312 def 212
4 212 def NaN
修改强>
如下面的@julius所述,sort(columns=
已被弃用,应替换为``sort_values(by =''。
答案 1 :(得分:0)
如果您需要查找该患者的所有访问,该怎么办?
sort[Date, ID]
[nextpatient] = [ID].shift(-1)
[nextvisit] = np.where([ID] == [nextpatient], 1, 0)
[nextdate] = np.where([nextvisit] == 1, [Date].shift(-1), datetime64.nat)
这是我的方法(在我的手机上键入,所以它不准确)。我排序然后转移一个独特的我。如果该ID与ID匹配,那么我将更改日期。然后我创建一个列来衡量交互之间的时间。还有另一栏确定访问的原因,也只是另一个转变。
我想知道这在速度方面是否也是一个好方法。我每周在500万行数据集上运行它。