我正在使用一个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()
我们可以推断出:
我是Python的新手,我是否应该首先重新构建数据框本身还是在做些麻烦,或者是否可以做一些优雅的事情来为治疗期添加一列。不胜感激!
答案 0 :(得分:0)
好吧,这个数据集中没有人!我在这里的方法是一次隔离每位患者,使问题更容易解决。为患者准备好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))