每组检索具有n个最旧和n个最新日期的行

时间:2019-04-15 12:50:23

标签: python pandas

让我们假设我在pythonpandas中具有以下数据集:

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

如何分别(分别)在pythonpandas中进行这些操作?

1 个答案:

答案 0 :(得分:3)

GroupBy.headGroupBy.tail一起使用:

还必须将日期时间与Stock_id进行排序,因此将to_datetimeDataFrame.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

使用nsmallestnlargest的解决方案:

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