Предположим, у меня есть следующий набор данных в 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
?
Используйте 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