Получить строки с n самыми старыми и n самыми новыми датами для группы

1

Предположим, у меня есть следующий набор данных в python и pandas:

Stock_id    Date    Stock_value
1   10/04/2019  2
1   11/04/2019  5
1   12/04/2019  1
1   13/04/2019  9
1   14/04/2019  6
1   15/04/2019  5
1   16/04/2019  7
2   12/04/2019  2
2   13/04/2019  9
2   14/04/2019  2
2   15/04/2019  4
2   16/04/2019  9

Теперь я хочу иметь n (2 в моем конкретном примере) строки с самыми старыми датами на группу:

Stock_id    Date    Stock_value
1   10/04/2019  2
1   11/04/2019  5
2   12/04/2019  2
2   13/04/2019  9

Также отдельно я хочу иметь n (2 в моем конкретном примере) строки с самыми новыми датами для группы:

Stock_id    Date    Stock_value
1   15/04/2019  5
1   16/04/2019  7
2   15/04/2019  4
2   16/04/2019  9

Как я могу сделать каждый из них (отдельно) в python и pandas?

Теги:
pandas

1 ответ

3

Используйте GroupBy.head с GroupBy.tail:

Также datetime должно быть отсортировано по Stock_id, поэтому используйте to_datetime с DataFrame.sort_values:

df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
df = df.sort_values(['Stock_id','Date'])

df1 = df.groupby('Stock_id').head(2)
print (df1)
   Stock_id       Date  Stock_value
0         1 2019-04-10            2
1         1 2019-04-11            5
7         2 2019-04-12            2
8         2 2019-04-13            9

df2 = df.groupby('Stock_id').tail(2)
print (df2)
    Stock_id       Date  Stock_value
5          1 2019-04-15            5
6          1 2019-04-16            7
10         2 2019-04-15            4
11         2 2019-04-16            9

Решение с nsmallest и nlargest:

df1 = df.groupby('Stock_id', group_keys=False).apply(lambda x: x.nsmallest(2, 'Date'))
print (df1)
   Stock_id       Date  Stock_value
0         1 2019-04-10            2
1         1 2019-04-11            5
7         2 2019-04-12            2
8         2 2019-04-13            9

df2 = df.groupby('Stock_id', group_keys=False).apply(lambda x: x.nlargest(2, 'Date'))
print (df2)
    Stock_id       Date  Stock_value
6          1 2019-04-16            7
5          1 2019-04-15            5
11         2 2019-04-16            9
10         2 2019-04-15            4
  • 1
    Хорошо спасибо. На самом деле я проверил это, но у меня это не сработало (все равно вернулись все даты); затем я увидел, что у меня была ошибка в моем исходном коде, и именно поэтому он не работал, ха-ха.
  • 0
    Кстати, а как насчет использования nlargest () и nsmallest ()? Если это работает, то вы можете пропустить часть .sort_values, я думаю?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню