python - 如何根据 pandas DataFrame 中的长度过滤 session

标签 python pandas

我在 pandas 中有以下 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

如何以最有效的方式做到这一点?

先谢谢你了。

/马蒂亚斯

最佳答案

使用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

关于python - 如何根据 pandas DataFrame 中的长度过滤 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53738527/

相关文章:

python - 为列表中的值组合创建 Pandas 数据框行的最快方法

python - 绘制 Pandas 数据框的饼图和表格

python - 为什么 `tox` 在 Windows 的系统 Python 目录中安装包?

python - 通过对齐日期在 pandas 数据框中创建 NaN 行

python - 在其他多项式上评估 numpy 多项式

python - 如何拆分json数据集并保存?

python - 将 Pandas DataFrame 转换为稀疏矩阵

python - 在 Pandas 中折叠列和索引

python - 使用 Python 从几个独特的站点中抓取联系信息

python - 将 PIL 图像转换为 skimage?