условное форвардное заполнение внутри группы - PullRequest
1 голос
/ 15 мая 2019

У меня есть фрейм данных о пациентах и ​​их посещениях клиники. Пациенты могут принимать лекарство при некоторых посещениях, и записывается только начальная доза или при изменении дозы. Если доза не изменится при следующем посещении, что записывается как «препарат продолжается? Да. Доза изменилась? Нет». Мне нужна точная доза для каждого визита.

Я пытался заполнить группу вперед с помощью groupby (groupby patient_id), но я застрял в том, как вставить условие, при котором заполнение отсутствует, только когда лекарство продолжается, а доза не изменяется.

df = pd.DataFrame({'patient_id': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'], \
              'visit_number':[1, 2, 3, 2, 3, 4, 10, 11, 12], \
             'drug_ongoing':[np.nan, 1, 1, np.nan, 0, 1, 1, 1, 0], \
             'drug_dose_changed':[0, 0, 0, 0, np.nan,0, 0, 1, np.nan], \
             'dose':[40, np.nan, np.nan, 60, np.nan, 70, 80, np.nan, np.nan]})

Я пытался:

df['dose_filled'] = df.groupby('patient_id')['dose'].ffill()

Но при этом все недостающее заполняется.

Требуемый новый столбец 'dose_filled' равен [40, 40, 40, 60, np.nan, 70, 80, np.nan, np.nan]

Ответы [ 2 ]

4 голосов
/ 15 мая 2019

В вашем случае фильтруйте перед ffill

s=df.loc[(df['drug_ongoing'].eq(1)&df['drug_dose_changed'].eq(0))|df.visit_number.eq(df.groupby('patient_id').visit_number.transform('first'))].groupby('patient_id').dose.ffill()
df.dose.fillna(s,inplace=True)
df
Out[38]: 
  patient_id  visit_number  drug_ongoing  drug_dose_changed  dose
0          a             1           NaN                0.0  40.0
1          a             2           1.0                0.0  40.0
2          a             3           1.0                0.0  40.0
3          b             2           NaN                0.0  60.0
4          b             3           0.0                NaN   NaN
5          b             4           1.0                0.0  70.0
6          c            10           1.0                0.0  80.0
7          c            11           1.0                1.0   NaN
8          c            12           0.0                NaN   NaN
2 голосов
/ 15 мая 2019

Я думаю, вам нужно:

np.where(~df.drug_dose_changed.astype(bool),df.dose.ffill(),df.dose)

Вывод:

array([40., 40., 40., 60., nan, 70., 80., nan, nan])
...