У меня есть кадр данных, который выглядит следующим образом:
id date isActive
0 1 2019-01-01 0
1 1 2019-01-02 1
2 1 2019-01-03 1
3 1 2019-01-04 0
4 1 2019-01-05 0
5 2 2019-01-01 0
6 2 2019-01-02 1
7 2 2019-01-03 0
8 2 2019-01-04 1
9 2 2019-01-05 0
Я хочу отфильтровать все неактивные ( isActive = 0) строки для каждого идентификатора, кроме самых последних строк для этот идентификатор неактивен. После этого мой фрейм данных должен выглядеть следующим образом:
id date isActive
0 1 2019-01-02 1
1 1 2019-01-03 1
2 1 2019-01-04 0
3 1 2019-01-05 0
4 2 2019-01-02 1
5 2 2019-01-04 1
6 2 2019-01-05 0
Я подумал, что мне следует попробовать сохранить все активные строки вместе со строками, связанными с последним набором последовательных isActive значения для каждого идентификатора. Для этого я попытался создать флаг, указывающий, когда изменяется переменная isActive , а затем попытался получить размер каждой из этих групп:
df['flag'] = df.groupby(['id', df['isActive'].eq(1).cumsum()])['isActive'].transform('size')
Затем я попытался использовать apply
и tail
чтобы сохранить каждую строку, которая удовлетворяла условиям, указанным выше, но я понял, что не могу просто получить доступ к значению flag последнего столбца:
df.groupby(['ID']).apply(lambda x: (x['Status'].eq(2)) | (x['Status'].tail(x['flag'])))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Я думаю Возможно, я переосмысливаю эту проблему. Есть ли какой-нибудь лучший подход?