首页 > 解决方案 > 根据阈值删除行

问题描述

我有一个多索引df:

这个df概述了一些人通过网站的路径,sid是会话,vid是访问者ID,pid是网页,ts是他们登陆网站的时间

           pid    ts
sid vid 
 1   A    page1    t1
     A    page2    t2
     A    page3    t3
     A    page4    t4
     A    page5    t5
 2   B    page1    t4
 3   C    page1    t5
     C    page2    t6

一些用户的 pid 路径长得离谱(1000+),我想这可能是一个错误。但是,当我转置/旋转这些数据时,转置需要很长时间,因为一些路径太长了。

所以我想施加一些阈值,在某个数字之后的每个会话(例如 3)它删除会话sid

我可以对等于 3 的行数施加一个阈值,然后 df 看起来像这样:

           pid    ts
sid vid 
 2   B    page1    t4
 3   C    page1    t5
     C    page2    t6

关于如何做到这一点的任何想法?

标签: pythonpandasdataframe

解决方案


当然,只需使用groupby+ filter。在这种情况下,“sid”似乎是 MultiIndex 的第 0 级,所以我们可以这样做:

df.groupby(level=0).filter(lambda x:len(x)<=3)

filter只留下 lambda 表达式为真的组,在这种情况下,这意味着组的长度(数据帧的行)小于或等于 3。

或者,您可以保留该组的第一行,例如 3 行,而不是通过执行以下操作完全消除它:

df.groupby(level=0).head(3)

推荐阅读