我在熊猫中有以下DataFrame,它由约3500万行组成,平均序列长度约为22:
session id servertime
1 3085 2018-10-09 13:20:25.096
1 3671 2018-10-21 08:19:39.078
1 2015 2018-10-23 21:22:27.647
7 4066 2018-10-29 00:04:16.707
7 4991 2018-10-30 11:00:57.918
7 4495 2018-10-31 04:50:56.864
7 5131 2018-11-04 10:49:03.044
7 4982 2018-11-04 12:02:03.738
7 4495 2018-11-04 12:43:53.595
7 3906 2018-11-05 16:55:17.891
7 8743 2018-11-06 16:55:17.891
7 6541 2018-11-07 16:55:17.891
7 3447 2018-11-08 16:55:17.891
7 6541 2018-11-08 18:55:17.891
7 1234 2018-11-09 16:55:17.891
20 10256 2018-08-28 11:09:35.902
20 11220 2018-09-09 06:49:48.44
20 5237 2018-09-13 12:01:09.677
20 5547 2018-09-13 12:02:34.762
20 6454 2018-09-13 12:07:40.061
当序列的长度大于10时,我想从序列中过滤掉“最旧的”值。 意思是,在上方的DataFrame中,序列7的长度为12。因此,我想过滤掉该序列中的前两行。
因此,预期输出应为以下内容:
session id servertime
1 3085 2018-10-09 13:20:25.096
1 3671 2018-10-21 08:19:39.078
1 2015 2018-10-23 21:22:27.647
7 4495 2018-10-31 04:50:56.864
7 5131 2018-11-04 10:49:03.044
7 4982 2018-11-04 12:02:03.738
7 4495 2018-11-04 12:43:53.595
7 3906 2018-11-05 16:55:17.891
7 8743 2018-11-06 16:55:17.891
7 6541 2018-11-07 16:55:17.891
7 3447 2018-11-08 16:55:17.891
7 6541 2018-11-08 18:55:17.891
7 1234 2018-11-09 16:55:17.891
20 10256 2018-08-28 11:09:35.902
20 11220 2018-09-09 06:49:48.44
20 5237 2018-09-13 12:01:09.677
20 5547 2018-09-13 12:02:34.762
20 6454 2018-09-13 12:07:40.061
如何最有效地做到这一点?
预先感谢您。
/ Mathias
答案 0 :(得分:1)
在两列中同时使用sort_values
,然后使用GroupBy.tail
:
df['servertime'] = pd.to_datetime(df['servertime'])
df1 = (df.sort_values(['session','servertime'])
.groupby('session', sort=False)
.tail(10))
print (df1)
session id servertime
0 1 3085 2018-10-09 13:20:25.096
1 1 3671 2018-10-21 08:19:39.078
2 1 2015 2018-10-23 21:22:27.647
5 7 4495 2018-10-31 04:50:56.864
6 7 5131 2018-11-04 10:49:03.044
7 7 4982 2018-11-04 12:02:03.738
8 7 4495 2018-11-04 12:43:53.595
9 7 3906 2018-11-05 16:55:17.891
10 7 8743 2018-11-06 16:55:17.891
11 7 6541 2018-11-07 16:55:17.891
12 7 3447 2018-11-08 16:55:17.891
13 7 6541 2018-11-08 18:55:17.891
14 7 1234 2018-11-09 16:55:17.891
15 20 10256 2018-08-28 11:09:35.902
16 20 11220 2018-09-09 06:49:48.440
17 20 5237 2018-09-13 12:01:09.677
18 20 5547 2018-09-13 12:02:34.762
19 20 6454 2018-09-13 12:07:40.061
答案 1 :(得分:0)
我会按日期对您的数据框进行排序,以便它们按顺序排列。然后只需保留每个groupby会话的最后10行。
# sort your dataframe by servertime
df = df.sort(['servertime'], ascending=[True])
# get groups by the session, and get last 10 rows
df.groupby('session').tail(10).reset_index(drop=True)