У меня есть dataframe, как этот:
a1 l1
0 a NaN
1 a kl
2 a NaN
3 a NaN
4 a er
5 b ye
6 b NaN
7 b fk
8 b NaN
Я хочу, это последнее предыдущее ненулевое значение l1 для каждой группы значений a1. Таким образом, ожидаемый результат:
a1 l1 ex
0 a NaN NaN
1 a kl NaN
2 a NaN kl
3 a NaN kl
4 a er kl
5 b ye NaN
6 b NaN ye
7 b fk ye
8 b NaN fk
Я попытался использовать сдвиг, но я не знаю, как пропустить отсутствующие значения.
Вам понадобится groupby
и apply
здесь:
df['ex'] = df.groupby('a1').l1.apply(lambda x: x.ffill().shift())
df
a1 l1 ex
0 a NaN NaN
1 a kl NaN
2 a NaN kl
3 a NaN kl
4 a er kl
5 b ye NaN
6 b NaN ye
7 b fk ye
8 b NaN fk
Альтернативно, цепочка двух groupby
вызовов подряд:
df['ex'] = df.groupby('a1').ffill().groupby('a1').shift()
df
a1 l1 ex
0 a NaN NaN
1 a kl NaN
2 a NaN kl
3 a NaN kl
4 a er kl
5 b ye NaN
6 b NaN ye
7 b fk ye
8 b NaN fk