Python熊猫:如何获取具有条件的先前日期

Python熊猫:如何获取具有条件的先前日期,python,pandas,Python,Pandas,我有以下列的数据集: 遭遇 FormName 类型属性 在FormName中,我有以下表格: 基线 随访 以下是一个示例数据: encounterDate, FormName, PersonID 2019-01-12, Baseline, 01 2020-01-01, Baseline, 01 2019-04-12, Follow-up, 01 2019-13-12, Follow-up, 01 2020-15-01, Follow-up, 01 我想要下表: encounterDate, F

我有以下列的数据集:

遭遇 FormName 类型属性 在FormName中,我有以下表格:

基线 随访 以下是一个示例数据:

encounterDate, FormName, PersonID
2019-01-12, Baseline, 01
2020-01-01, Baseline, 01
2019-04-12, Follow-up, 01
2019-13-12, Follow-up, 01
2020-15-01, Follow-up, 01
我想要下表:

encounterDate, FormName, PersonID, Previous_date
2019-01-12, Baseline, 01, null
2020-01-01, Baseline, 01, 2019-01-12
2019-04-12, Follow-up, 01, null
2019-13-12, Follow-up, 01, 2019-04-12
2020-15-01, Follow-up, 01, 2019-13-12
如何用Python编写此代码

此外,我还想对他们进行排名:

encounterDate, FormName, PersonID, Previous_date, Rank
2019-01-12, Baseline, 01, null, 1
2020-01-01, Baseline, 01, 2019-01-12, 2
2019-04-12, Follow-up, 01, null, 1
2019-13-12, Follow-up, 01, 2019-04-12, 2
2020-15-01, Follow-up, 01, 2019-13-12, 3
下面是我在SQL中的工作代码

select encounter_date,FormName,PersonID
, date((select max(enc.encounter_datetime) 
                from encounter enc 
                where enc.patient_id=e.patient_id 
                        and enc.encounter_type=e.encounter_type 
                        and date(e.encounter_datetime)>date(enc.encounter_datetime))) previous_date

from encounter e
先谢谢你


John

您好,您可以使用下面的换档功能进行换档

 od=pd.DataFrame([['2019-01-12','Baseline',"01"],["2019-01-12","Baseline","01"]],
         columns=["encounterDate", "FormName", "PersonID"])
od['Previous_date']=od.shift(1)['encounterDate']

这对熊猫来说是相当直接的

看起来您需要同时按PersonID和FormName进行分组,以获得正确的分组。在这些组中,您需要更改遭遇日期,并且需要相同的累计计数

cumcount从零开始,因此您可能希望将1添加到秩列以获得所需的输出

import pandas as pd

df = pd.DataFrame({
    'encounterDate': ['2019-01-12','2020-01-01','2019-04-12','2019-13-12','2020-15-01'],
    'FormName': ['Baseline','Baseline','Follow-up','Follow-up','Follow-up'],
    'PersonID': [1, 1, 1, 1, 1]
})

df[['Previous_date',
    'Rank']] = df.groupby(['PersonID',
                           'FormName']).agg(Previous_date=('encounterDate','shift'),
                                            Rank=('encounterDate','cumcount'))

df['Rank']+=1
输出

  encounterDate   FormName  PersonID Previous_date  Rank
0    2019-01-12   Baseline         1           NaN     1
1    2020-01-01   Baseline         1    2019-01-12     2
2    2019-04-12  Follow-up         1           NaN     1
3    2019-13-12  Follow-up         1    2019-04-12     2
4    2020-15-01  Follow-up         1    2019-13-12     3

你能告诉我们你到目前为止都做了些什么吗?请重复一遍,然后开始。演示如何解决这个编码问题?堆栈溢出的主题已关闭。您必须诚实地尝试解决方案,然后询问有关实现的具体问题。Stack Overflow并不是为了取代现有的教程和文档。嗨,Chris,我实际上来自SQL,所以我有一个SQL的工作代码,但现在我想用Python来做这件事。下面是我在SQL中的代码:选择Conference_date、FormName、PersonID、date从Conference enc中选择maxenc.Conference_datetime,其中enc.patient_id=e.patient_id,enc.Conference_type=e.Conference_type和datee.Conference_datetime>dateenc.Conference_datetime从Conference中选择上一个日期e@John,你应该编辑你的原始问题并添加代码。谢谢你的解决方案克里斯!成功了!我真的很感激。