groupby中的条件前填充

时间:2019-05-15 14:21:09

标签: python pandas dataframe pandas-groupby missing-data

我有一个用于患者及其去诊所的数据框。患者可能会在某些就诊时服用药物,并且仅记录初始剂量或更改剂量时。如果在下次访问时剂量没有变化,则记录为“正在服用药物?是。剂量已改变?否”。我需要得到的是每次访问的确切剂量。

我尝试使用groupby(groupby OnGet())进行正向填充,但是我陷入了如何插入仅在进行药物且剂量不变的情况下仅填充缺失的条件的问题。

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'

2 个答案:

答案 0 :(得分:4)

对于您而言,请在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

答案 1 :(得分:2)

我认为您需要:

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

输出:

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