![](/img/trans.png)
[英]How to perform a conditional groupby calculation in pandas and forward fill zero values
[英]conditional forward fill within groupby
我有一个病人及其去诊所的数据框。 患者可能会在某些就诊时服用药物,并且仅记录初始剂量或更改剂量时。 如果在下次访问时剂量没有变化,则记录为“正在服用药物?是。剂量已改变?否”。 我需要得到的是每次访问的确切剂量。
我尝试使用groupby(groupby patient_id
)进行正向填充,但是我陷入了如何插入仅在进行药物且剂量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]
在您的情况下,请先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
我认为您需要:
np.where(~df.drug_dose_changed.astype(bool),df.dose.ffill(),df.dose)
输出:
array([40., 40., 40., 60., nan, 70., 80., nan, nan])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.