Вопрос или проблема
У меня есть датафрейм, в котором я хочу вернуть количество (долю) пациентов, которые прошли последующий осмотр после диагноза заболевания.
Исходный ДФ (пример 1 пациента)
| patient_id | app_date | diag_date | cancer_yn |
|------------|------------|------------|-----------|
| 1 | 2024-01-11 | NaT | NaN |
| 1 | 2024-03-14 | 2022-03-14 | 1 |
| 1 | 2024-04-09 | NaT | NaN |
| 1 | 2024-09-09 | NaT | NaN |
Вы можете увидеть, что во 2-й записи указана запись, когда был поставлен диагноз (diag_date
доступен и совпадает с app_date
), у этого пациента были последующие записи, я хочу пометить это как случай (например, follow_ups == 1
).
Мне сложно понять, как я могу сгруппировать разных пациентов и применить value_counts() к флагу, указывающему на то, что пациент прошел последующие осмотры после диагноза. Предложения по способам преобразования данных и генерации флага были бы отличными.
Ответ или решение
Вопрос, который вы подняли, связан с анализом данных в датафрейме, содержащем информацию о пациентах, их диагнозах и последующих посещениях. В данной ситуации нам необходимо определить, имелись ли последующие записи о приёме после даты диагноза. В этой статье мы рассмотрим, как провести такое сравнение и вычислить необходимую пропорцию.
Шаг 1: Понимание структуры данных
На примере вашего датафрейма, мы видим столбцы:
patient_id
(идентификатор пациента)app_date
(дата приёма)diag_date
(дата диагноза)cancer_yn
(индикатор наличия рака)
Шаг 2: Определение логики
Для каждого пациента нам необходимо определить:
- Дату диагноза.
- Имеются ли записи о приёмах (
app_date
), которые происходят после этой даты.
Шаг 3: Реализация в Python с использованием Pandas
Теперь перейдем к коду. Для работы с вашим датафреймом мы воспользуемся библиотекой Pandas.
import pandas as pd
# Пример исходного датафрейма
data = {
'patient_id': [1, 1, 1, 1],
'app_date': pd.to_datetime(['2024-01-11', '2024-03-14', '2024-04-09', '2024-09-09']),
'diag_date': [pd.NaT, pd.to_datetime('2022-03-14'), pd.NaT, pd.NaT],
'cancer_yn': [pd.NA, 1, pd.NA, pd.NA]
}
df = pd.DataFrame(data)
# Добавляем столбец для хранения информации о последующих посещениях
def get_follow_up_flag(group):
# Дата диагноза
diag_date = group['diag_date'].dropna().iloc[0] if not group['diag_date'].dropna().empty else pd.NaT
# Проверяем, есть ли последующие посещения
group['follow_ups'] = (group['app_date'] > diag_date).astype(int) if pd.notna(diag_date) else 0
return group
# Группируем по пациентам и применяем функцию для вычисления флага
df = df.groupby('patient_id').apply(get_follow_up_flag)
# Подсчитываем количество пациентов с последующими посещениями
follow_up_counts = df.groupby('patient_id')['follow_ups'].max()
# Вычисляем пропорцию пациентов с последующими посещениями
proportion = (follow_up_counts.sum() / len(follow_up_counts)) * 100
print("Пропорция пациентов с последующими посещениями (после диагноза): {:.2f}%".format(proportion))
Объяснение кода
- Импортируем библиотеки: Мы импортируем Pandas для работы с данными.
- Создаем датафрейм: Определяем структуру данных с помощью словаря и преобразуем даты в формат datetime.
- Функция get_follow_up_flag:
- Выбираем дату диагноза.
- Проверяем, есть ли последующие посещения, используя сравнение дат.
- Добавляем соответствующий флаг
follow_ups
.
- Группировка по пациентам: Применяем функцию для каждого пациента.
- Подсчет и вычисление пропорции: Подсчитываем количество пациентов с флагом последующих посещений и вычисляем пропорцию.
Заключение
Описанный метод позволяет вам быстро и эффективно определять, имели ли пациенты последующие посещения после диагноза. Это даст возможность провести дальнейший анализ и сделать выводы о требуемых медицинских вмешательствах. Важно использовать такие инструменты, как Pandas, для оптимизации обработки данных и анализа, что значительно повышает эффективность работы аналитиков в медицинской сфере.