让我们假设我在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
中进行这些操作?
答案 0 :(得分:3)
将GroupBy.head
与GroupBy.tail
一起使用:
还必须将日期时间与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