微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas按日期获取以前的数据帧

我正在使用一些数据,我必须得到发生日期.例如,假设我们正在处理医疗数据.每行都是来自患者的独特访问,尽管同一患者可以有多行.每行还包含有关访问类型的信息,无论是常规还是急诊室.

我需要通过,并且在每次访问之前,先获取患者之前进入急诊室的日期.例如,我想添加一列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)

上面的代码有效,但速度很慢,我希望能帮助找到更快的方法来实现这一目标.我正在使用的数据集有几十万行,这是必须每天运行的东西.

谢谢!

解决方法:

在熊猫中,你基本上想要避免循环,因为它们会破坏性能.

她是一个类似于你的数据框架(我对日期很懒,所以它们是整齐的;这是同样的想法).

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 =”)代替.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐