Pandas如何根据日期获取前一行数据框的数据

4
我正在处理一些数据,需要获取发生日期。例如,我们正在处理医疗数据。每行都是患者的独特就诊记录,尽管同一患者可能有多个记录。每行还包含有关访问类型的信息,无论是例行检查还是急诊室。
我需要遍历每一行,并获取该就诊之前患者上次入院急诊室的日期。例如,我想添加一个名为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_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)

上述代码可以工作,但速度较慢,我希望能够得到帮助,找到更快的方法来解决这个问题。我处理的数据集有几十万行,而且这是每天都必须运行的任务。

谢谢!

2个回答

15

在pandas中,你基本上想要避免使用循环,因为它们会影响性能。

这是一个与你的DataFrame类似的示例(我懒得处理日期,所以它们是整数;但是想法是一样的)。

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=''。


2
g.sort现已弃用,请使用“g.sort_values(by=['date'])”。 - Julius
没问题,你的解决方案救了我的命 :-) - Julius

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匹配,则将日期向上移动。然后我创建一列来衡量交互之间的时间。另外还有一列用于确定访问原因,也只是进行了另一个移动。

我想知道这种方法在速度方面是否好。我每周对500万行数据集运行一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接