Skip to main content
 首页 » 编程设计

python之groupby 内的条件前向填充

2025年05月04日15txw1958

我有一个关于患者及其就诊次数的数据框。患者可能会在某些就诊时服用药物,但仅记录初始剂量,或在剂量发生变化时记录。如果下次就诊时剂量没有改变,则记录为“药物持续使用?是。剂量改变了?没有”。我需要得到的是每次访问的确切剂量。

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

请您参考如下方法:

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