#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных, который выглядит так
id week value
1 1 15
1 2 29
1 3 49
1 3 19
2 6 10
2 7 99
2 8 53
Как извлечь фрейм данных на основе последних 2 недель для каждого идентификатора?
Это похоже на хвост, но не для записей.
Желаемый результат
id week value
1 2 29
1 3 49
1 3 19
2 7 99
2 8 53
Ответ №1:
Это больше похоже factorized
на то, чтобы выбрать последние два из каждой группы
m = df.iloc[::-1].groupby('id')['week'].transform(lambda x :x.factorize()[0]).isin([0,1])
out = df[m]
id week value
1 1 2 29
2 1 3 49
3 1 3 19
5 2 7 99
6 2 8 53
Или мы исправляем tail
с помощью drop_duplicates
df.merge(df.drop_duplicates(['id','week']).groupby('id').tail(2).drop('value',1))
id week value
0 1 2 29
1 1 3 49
2 1 3 19
3 2 7 99
4 2 8 53
Ответ №2:
Предположим, что данные были отсортированы по идентификатору и неделе, тогда groupby tail выполнит эту работу
df.groupby('id').tail(2)
Пересмотр:
(df[['id', 'week']]
.drop_duplicates()
.groupby('id')
.tail(2)
.merge(df)
)
Комментарии:
1. Это не хвост, потому что количество записей за последние 2 недели может отличаться
2. См. Пересмотренный ответ