使用时间增量对时间范围进行分组?

时间:2018-10-20 22:30:35

标签: python csv

我正在使用一个csv文件,该文件详细说明了唯一患者及其在特定时间段内所接受的治疗。我们想看看在第一轮结束后90天以上有多少患者接受了辅助治疗。

这里是一个示例:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC

wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Syndicating From My Site']"))).click()

我们可以推断出:

  1. 0-7行属于2038年患者的一个治疗期
  2. 从2010年1月25日开始,2120位患者同时使用A和B两种药物。

我是Python的新手,我是否应该首先重新构建数据框本身还是在做些麻烦,或者是否可以做一些优雅的事情来为治疗期添加一列。不胜感激!

2 个答案:

答案 0 :(得分:0)

第一轮结束后90天以上,有多少患者接受了辅助治疗?

好吧,这个数据集中没有人!我在这里的方法是一次隔离每位患者,使问题更容易解决。为患者准备好DataFrame后,我添加了一个带有时间偏移的列,因此我可以添加另一个包含时间增量的列。因此,使用生成的patient_df,您可以执行以下操作:

from datetime import timedelta
over_ninety = patient_df[patient_df['TimeDelta'] > timedelta(days=90)]

我认为有一个更好的方法可以做到这一点,因为通常情况下,只要您与Pandas进行循环,这都是很容易编写的。我认为Pandas MultiIndex可能是将这些全部保留在一个DataFrame中或将TimeDelta列合并回原始DataFrame的一种方式。

import pandas as pd

# Leaving out code to create df with your example data set...

for unique_patient in df['PatientID'].unique():
    patient_df = df[df['PatientID'] == unique_patient].copy()
    patient_df['NextDate'] = patient_df['TreatmentDate'].shift(-1)
    patient_df['TimeDelta'] = patient_df['NextDate'] - patient_df['TreatmentDate']
    print(patient_df)

   PatientID TreatmentDate DrugCode   NextDate TimeDelta
0       2038    2010-01-24        A 2010-01-27    3 days
1       2038    2010-01-27        A 2010-01-30    3 days
2       2038    2010-01-30        A 2010-02-02    3 days
3       2038    2010-02-02        A 2010-02-06    4 days
4       2038    2010-02-06        A 2010-02-11    5 days
5       2038    2010-02-11        A 2010-02-18    7 days
6       2038    2010-02-18        A 2010-02-20    2 days
7       2038    2010-02-20        A        NaT       NaT
    PatientID TreatmentDate DrugCode   NextDate TimeDelta
8        2120    2010-01-25        A 2010-01-25    0 days
9        2120    2010-01-25        B 2010-01-26    1 days
10       2120    2010-01-26        A 2010-01-26    0 days
11       2120    2010-01-26        B 2010-01-27    1 days
12       2120    2010-01-27        A 2010-01-27    0 days
13       2120    2010-01-27        B 2010-01-29    2 days
14       2120    2010-01-29        A 2010-01-29    0 days
15       2120    2010-01-29        B 2010-02-01    3 days
16       2120    2010-02-01        A 2010-02-01    0 days
17       2120    2010-02-01        B 2010-02-04    3 days
18       2120    2010-02-04        A 2010-02-04    0 days
19       2120    2010-02-04        B        NaT       NaT

答案 1 :(得分:0)

如果我的理解是正确的:

from datetime import datetime
from datetime import timedelta

# Generate a datetime column
df.dates_formatted = df.apply(lambda x: datetime(x.TreatmentDate.split('/')[2],\
 x.TreatmentDate.split('/')[0], x.TreatmentDate.split('/')[1])

# Generate a difference between each datetime stamp after sort
def get_timediff(df):
    df = df.sort_values('TreatmentDate')
    df.DateDiff = df.TreatmentDate.diff()
    df.DateDiff 
    return df

new_df = df.groupby('PatientID').apply(get_timediff(df))

# Return a series of patientID : True/False
new_df.groupby('PatientID').apply(lambda df: df.DateDiff.max > timedelta(days=90))