【问题标题】:conditional forward fill within groupbygroupby 内的条件前向填充
【发布时间】:2019-10-02 17:34:20
【问题描述】:

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

我尝试使用 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]

【问题讨论】:

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


    【解决方案1】:

    我认为你需要:

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

    输出:

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

    【讨论】:

      【解决方案2】:

      在你的情况下,在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
      

      【讨论】:

      • 嗯,那我是不是错过了groupby?
      • 我明白了,这里也是,错过了groupby
      • 感谢您的回答!但是在我的情况下,初次就诊的 drug_ongoing 列不必为 1。在这种情况下,您的回答不会结转初始剂量。我想我做了一个不好的例子。我刚刚编辑了问题。
      • @WeNYoBen 初始剂量可以在任何访问时发生。一些患者很晚才开始服药。我再次编辑了这个问题。对不起:(
      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多