首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >groupby中的条件正向填充

groupby中的条件正向填充
EN

Stack Overflow用户
提问于 2019-05-15 22:21:09
回答 2查看 204关注 0票数 1

我有一个病人和他们去诊所就诊的数据框架。患者可能会在某些就诊时服用药物,并且只记录最初的剂量,或者当剂量改变时。如果剂量在下一次就诊时没有改变,那么记录的是“正在用药?是。剂量改变了?不是”。我需要得到的是每次访问的确切剂量。

我尝试了用groupby (groupby patient_id)进行前向填充,但我被困在如何插入只有在药物正在进行且剂量没有改变时才会丢失的条件。

代码语言:javascript
复制
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]})

我试过了:

代码语言:javascript
复制
df['dose_filled'] = df.groupby('patient_id')['dose'].ffill()

但通过这种方式,所有缺失的部分都被填补了。

所需的新列'dose_filled'[40, 40, 40, 60, np.nan, 70, 80, np.nan, np.nan]

EN

回答 2

Stack Overflow用户

发布于 2019-05-15 22:26:34

在您的情况下,在ffill之前进行过滤

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2019-05-15 22:25:53

我认为你需要:

代码语言:javascript
复制
np.where(~df.drug_dose_changed.astype(bool),df.dose.ffill(),df.dose)

输出:

代码语言:javascript
复制
array([40., 40., 40., 60., nan, 70., 80., nan, nan])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56151618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档