Pandas: группировка и получение хвоста на основе некоторого значения столбца

#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. См. Пересмотренный ответ