Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫按日期获取上一个数据帧行_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫按日期获取上一个数据帧行

Python 熊猫按日期获取上一个数据帧行,python,pandas,dataframe,Python,Pandas,Dataframe,我正在处理一些数据,我必须得到发生的日期。例如,假设我们正在处理医疗数据。每一行都是患者的唯一就诊,尽管同一患者可以有多行。每行还包含就诊类型的信息,无论是常规就诊还是急诊就诊 我需要检查每一行,在就诊之前,获取患者之前被送入急诊室的日期。例如,我想添加一列previous_er_discharge_date,如下所示: visit_id patient_id discharge_date visit_type previous_er_discharge_date 1

我正在处理一些数据,我必须得到发生的日期。例如,假设我们正在处理医疗数据。每一行都是患者的唯一就诊,尽管同一患者可以有多行。每行还包含就诊类型的信息,无论是常规就诊还是急诊就诊

我需要检查每一行,在就诊之前,获取患者之前被送入急诊室的日期。例如,我想添加一列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)
er_visions=main_data[main_data.visit_type=='emergency']
上一个日期=[]
对于索引,main_data.iterrows()中的行:
日期=急诊就诊。出院日期[(急诊就诊。患者id==行。患者id)&
(er_访问出院日期<行出院日期)]值
如果len(日期)>0:
上一个日期。追加(日期[0])
其他:
上一个日期追加(pd.NaT)
上面的代码可以工作,但速度很慢,我希望能得到帮助,找到更快的方法来实现这一点。我处理的数据集有几十万行,这是每天都要运行的


谢谢

在pandas中,您基本上希望避免循环,因为它们会破坏性能

她的数据帧与你的数据帧相似(我对日期很懒惰,所以它们是整数;这是相同的想法)

这里有一个函数,对于每个组,都会附加上一个日期:

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\u值”(by='')代替。

如果您需要查找该患者的所有就诊怎么办

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与ID匹配,那么我将向上移动日期。然后我创建一个列来测量交互之间的时间。还有另一个列来确定访问的原因,也只是另一个移动


我不知道这在速度方面是否也是一个好方法。我每周在500万行数据集上运行一次。

g.sort现在不推荐使用“g.sort_值(by=['date'])”没问题,你的解决方案救了我一命:-)
sort[Date, ID]
[nextpatient] = [ID].shift(-1)
[nextvisit]  = np.where([ID] == [nextpatient],  1, 0)
[nextdate]  = np.where([nextvisit] == 1, [Date].shift(-1),   datetime64.nat)