С comb_first вы избалованы выбором.
Первый вариант
Используйте .groupby()
с nth(value)
m=df.groupby('id',as_index=False).nth(-1).index#mask each last value in the group
df.loc[m, 'target'] = df['target'].combine_first(df['value'])populate value
Второй вариант
Используйте combine_first
с помощью метода доступа .iloc
, чтобы получить последние значения в столбце target
и value
в одной строке groupby
df.groupby('id').apply(lambda x:(x.iloc[-1:,3].combine_first(x.iloc[-1:,2])))\
.reset_index(level=0).combine_first(df)
Третий вариант
Выберите последний индекс в каждой группе. Заполните целевой столбец по мере необходимости и обновите df, используя comb_first
g=df.groupby('id').apply(lambda x:x.iloc[-1:]).reset_index(level=0, drop=True)
#df.loc[g, 'target'] = df['target'].combine_first(df['value'])
g.target=g.value
g.combine_first(df)
date id value target
0 2020-08-07 id01 0.100775 NaN
1 2020-08-08 id01 0.215885 0.215885
2 2020-08-09 id01 0.012154 0.012154
3 2020-08-10 id01 0.374503 0.374503
4 2020-08-07 id02 0.369707 0.369707
5 2020-08-08 id02 0.676743 0.676743
6 2020-08-09 id02 0.659521 0.659521
7 2020-08-10 id02 0.799071 0.799071