У меня есть датафрейм, который состоит из идентификаторов и дат.У одного идентификатора может быть несколько дат - идентификаторы отсортированы по датам для каждого идентификатора.
AccidentDates
Мой второй кадр данных состоит из идентификаторов, даты начала,Дата завершения, логический столбец Авария (указывает на возникновение аварии) и столбец Время до события.Последние два столбца изначально установлены на 0. Идентификаторы отсортированы, а также временные интервалы для каждого идентификатора еще раз.
PatientLog
Я хочу обновитьдва столбца второго кадра данных, основанные на зарегистрированных авариях первого кадра данных.Если идентификатор существует на обоих фреймах данных (он не обязан), проверьте, не было ли каких-либо аварий, зарегистрированных в любом из интервалов второго фрейма данных.
Если было, найдите, в каком интервале это произошло, обновите столбец Авария до 1 и Time = df1.Date - df2.Start.Если нет, установите Accident = 0 и Time = df2.Finish - df2.Start для этой записи пациента.
Мне удалось сделать это через списки и циклы.Однако мне было интересно, есть ли более умный способ, поскольку объем данных огромен, и для завершения всей процедуры требуется много времени.Заранее спасибо!
# Temporary lists
df1list = []
df2list = []
# Change format from dataframe to list
for row in df1.itertuples(index=True, name='Pandas'):
# Get Patient ID and the date of the recorded accident
df1list.append([getattr(row, "Patient"), getattr(row, "regdatum")])
# Change format from dataframe to list
for row in df2.itertuples(index=True, name='Pandas'):
# Get Patient ID, info, occurrence of accident and time to event
df2list.append([getattr(row, "Patient"), getattr(row, "Start"), getattr(row, "Finish"), getattr(row, "Gender"),
getattr(row, "Age"), getattr(row, "Accident"), getattr(row, "Time")])
#For each interval of each patient
for i in range(0, len(df2list)):
#For each recorded accident of each patient
for j in range(0, len(df1list)):
#If there's a match in both lists
if df2list[i][0] == df1list[j][0]:
#If the recorded date is in between the time interval
if (df1list[j][1] >= datetime.strptime(df2list[i][1], '%Y-%m-%d')) & (df1list[j][1] <= datetime.strptime(df2list[i][2], '%Y-%m-%d')):
#Change the accident column to 1 and calculate the time to event
#The extra if is to verify that this is the recorded accident is the first one to have happened within the time interval (if there are multiple, we only keep the first one)
if df2list[i][6] == 0 :
df2list[i][6] = 1
df2list[i][7] = df1list[j][1] - datetime.strptime(df2list[i][1], '%Y-%m-%d')
#Back to dfs
labels = ['Patient', 'Start', 'Finish', 'Gender', 'Age', 'Accident', 'Time']
df = pd.DataFrame.from_records(df2list, columns=labels)
```